thread-master/apps/backend/generate/api/m5.api

471 lines
14 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

syntax = "v1"
// M5: inspire + research + media image + scout
type (
// --- Inspire ---
TrendPublic {
Id string `json:"id"`
Kind string `json:"kind"`
Label string `json:"label"`
Summary string `json:"summary"`
Heat int `json:"heat"`
Keywords []string `json:"keywords"`
Samples []string `json:"samples"`
SourceLabel string `json:"source_label"`
ObservedAt int64 `json:"observed_at"`
}
TrendListData {
List []TrendPublic `json:"list"`
}
InspireElementPublic {
Id string `json:"id"`
Kind string `json:"kind"`
Title string `json:"title"`
Body string `json:"body"`
RefId string `json:"ref_id,optional"`
Reusable bool `json:"reusable"`
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
InspireElementListData {
List []InspireElementPublic `json:"list"`
}
InspireElementSaveReq {
Id string `json:"id,optional"`
Kind string `json:"kind,optional"`
Title string `json:"title"`
Body string `json:"body"`
RefId string `json:"ref_id,optional"`
Reusable bool `json:"reusable,optional"`
}
InspireElementIdPath {
Id string `path:"id"`
}
InspireDraftPublic {
Title string `json:"title,optional"`
Body string `json:"body"`
}
InspireMessagePublic {
Id string `json:"id"`
Role string `json:"role"`
Text string `json:"text"`
Draft InspireDraftPublic `json:"draft,optional"`
CreatedAt int64 `json:"created_at"`
}
InspireSessionPublic {
Id string `json:"id"`
Title string `json:"title,optional"`
Messages []InspireMessagePublic `json:"messages"`
PinnedElementIds []string `json:"pinned_element_ids"`
CreatedAt int64 `json:"created_at,optional"`
UpdatedAt int64 `json:"updated_at"`
}
// 列表摘要(不含完整 messages
InspireSessionSummaryPublic {
Id string `json:"id"`
Title string `json:"title"`
Preview string `json:"preview"`
MessageCount int `json:"message_count"`
UpdatedAt int64 `json:"updated_at"`
CreatedAt int64 `json:"created_at"`
Active bool `json:"active"`
}
InspireSessionListData {
List []InspireSessionSummaryPublic `json:"list"`
}
InspireSessionIdPath {
Id string `path:"id"`
}
InspireSessionCreateReq {
Title string `json:"title,optional"`
}
InspireChatReq {
Message string `json:"message"`
PinnedIds []string `json:"pinned_ids,optional"`
Mode string `json:"mode,optional"` // chat|generate
PersonaId string `json:"persona_id,optional"`
SessionId string `json:"session_id,optional"` // 空 = active
// generate 專用:待改寫素材(鎖定內容);空則拒絕產文
Material string `json:"material,optional"`
}
InspireChatData {
Session InspireSessionPublic `json:"session"`
Messages []InspireMessagePublic `json:"messages"`
}
// 觀測:與送出相同的 prompt 組裝(不呼叫 AI、不計費
InspirePromptPreviewReq {
Message string `json:"message,optional"`
PinnedIds []string `json:"pinned_ids,optional"`
Mode string `json:"mode,optional"` // chat|generate
PersonaId string `json:"persona_id,optional"`
SessionId string `json:"session_id,optional"`
Material string `json:"material,optional"`
}
InspirePromptPinnedPublic {
Id string `json:"id"`
Kind string `json:"kind"`
Title string `json:"title"`
Body string `json:"body"`
}
InspirePromptBlockPublic {
Title string `json:"title"`
Body string `json:"body"`
}
InspirePromptPreviewData {
Prompt string `json:"prompt"`
Mode string `json:"mode"`
Sections []string `json:"sections"`
Blocks []InspirePromptBlockPublic `json:"blocks"`
Fingerprint string `json:"fingerprint"`
CharCount int `json:"char_count"`
RuneCount int `json:"rune_count"`
Pinned []InspirePromptPinnedPublic `json:"pinned"`
Note string `json:"note,optional"`
}
ResearchSearchReq {
Query string `json:"query"`
}
ResearchHitPublic {
Id string `json:"id"`
Title string `json:"title"`
Snippet string `json:"snippet"`
Url string `json:"url"`
Summary string `json:"summary,optional"`
LearnPoints []string `json:"learn_points,optional"`
ReplyHooks []string `json:"reply_hooks,optional"`
SourceLabel string `json:"source_label,optional"`
}
ResearchSearchData {
List []ResearchHitPublic `json:"list"`
}
GenerateImageReq {
Prompt string `json:"prompt"`
}
GenerateImageData {
Id string `json:"id"`
Url string `json:"url"`
Prompt string `json:"prompt"`
}
// --- Scout ---
BrandPublic {
Id string `json:"id"`
DisplayName string `json:"display_name"`
Brief string `json:"brief"`
TargetAudience string `json:"target_audience,optional"`
Goals string `json:"goals,optional"`
}
BrandListData {
List []BrandPublic `json:"list"`
}
BrandSaveReq {
Id string `json:"id,optional"`
DisplayName string `json:"display_name"`
Brief string `json:"brief,optional"`
TargetAudience string `json:"target_audience,optional"`
Goals string `json:"goals,optional"`
}
BrandIdPath {
Id string `path:"id"`
}
BrandActiveData {
Id string `json:"id"`
}
BrandSetActiveReq {
Id string `json:"id"`
}
ProductPublic {
Id string `json:"id"`
BrandId string `json:"brand_id"`
Label string `json:"label"`
ProductContext string `json:"product_context"`
MatchTags []string `json:"match_tags"`
PainPoints []string `json:"pain_points"`
PlacementUrl string `json:"placement_url,optional"`
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
ProductListData {
List []ProductPublic `json:"list"`
}
ProductSaveReq {
Id string `json:"id,optional"`
BrandId string `json:"brand_id"`
Label string `json:"label"`
ProductContext string `json:"product_context,optional"`
MatchTags []string `json:"match_tags,optional"`
PainPoints []string `json:"pain_points,optional"`
PlacementUrl string `json:"placement_url,optional"`
}
ProductIdPath {
Id string `path:"id"`
}
ProductListReq {
BrandId string `form:"brand_id,optional"`
}
ImportProductReq {
Url string `json:"url"`
}
ImportProductData {
Label string `json:"label"`
ProductContext string `json:"product_context"`
PainPoints []string `json:"pain_points"`
MatchTags []string `json:"match_tags"`
PlacementUrl string `json:"placement_url"`
SourceNote string `json:"source_note"`
}
ScoutBriefReq {
Intent string `json:"intent"`
BrandId string `json:"brand_id,optional"`
ProductId string `json:"product_id,optional"`
Purpose string `json:"purpose,optional"`
Deep bool `json:"deep,optional"`
}
ScoutBriefPublic {
Intent string `json:"intent"`
Mode string `json:"mode"`
BrandId string `json:"brand_id,optional"`
ProductId string `json:"product_id,optional"`
ProductLabel string `json:"product_label,optional"`
Pains []string `json:"pains"`
Tags []string `json:"tags"`
Periphery []string `json:"periphery"`
ScanTerms []string `json:"scan_terms"`
PlacementNote string `json:"placement_note,optional"`
ResponseStance string `json:"response_stance,optional"`
ThemeKey string `json:"theme_key,optional"`
ThemeLabel string `json:"theme_label,optional"`
ProductContext string `json:"product_context,optional"`
}
ScoutScanReq {
Brief ScoutBriefPublic `json:"brief"`
}
ScoutScanJobData {
Job JobPublic `json:"job"`
}
ScoutPostPublic {
Id string `json:"id"`
BrandId string `json:"brand_id,optional"`
Author string `json:"author"`
Text string `json:"text"`
SearchTag string `json:"search_tag"`
Opportunity string `json:"opportunity"`
OutreachStatus string `json:"outreach_status"`
DraftText string `json:"draft_text,optional"`
Score int `json:"score"`
MatchedProductId string `json:"matched_product_id,optional"`
MatchedProductLabel string `json:"matched_product_label,optional"`
MatchReason string `json:"match_reason,optional"`
ScoutMode string `json:"scout_mode,optional"`
IntentSnippet string `json:"intent_snippet,optional"`
ThemeKey string `json:"theme_key,optional"`
ThemeLabel string `json:"theme_label,optional"`
ScanPath string `json:"scan_path,optional"`
Classification string `json:"classification,optional"`
Permalink string `json:"permalink,optional"`
CreatedAt int64 `json:"created_at"`
}
ScoutPostListData {
List []ScoutPostPublic `json:"list"`
}
ScoutPostListReq {
BrandId string `form:"brand_id,optional"`
}
ScoutPostIdPath {
Id string `path:"id"`
}
ScoutDraftPathReq {
Id string `path:"id"`
PersonaId string `json:"persona_id,optional"`
}
ScoutSendPathReq {
Id string `path:"id"`
Text string `json:"text,optional"`
AccountId string `json:"account_id,optional"`
}
ScoutThemePath {
ThemeKey string `path:"themeKey"`
}
ScoutHomeworkPublic {
ThemeKey string `json:"theme_key"`
ThemeLabel string `json:"theme_label"`
Purpose string `json:"purpose"`
Brief ScoutBriefPublic `json:"brief"`
CreatedAt int64 `json:"created_at"`
}
ScoutHomeworkListData {
List []ScoutHomeworkPublic `json:"list"`
}
ScoutHomeworkSaveReq {
ThemeKey string `json:"theme_key"`
ThemeLabel string `json:"theme_label"`
Purpose string `json:"purpose,optional"`
Brief ScoutBriefPublic `json:"brief"`
}
ScoutCrawlerSessionReq {
Token string `json:"token"`
}
)
@server (
jwt: Auth
group: inspire
prefix: /api/v1/inspire
middleware: AuthJWT
)
service gateway {
@handler ListTrends
get /trends returns (TrendListData)
@handler RefreshTrends
post /trends/refresh returns (TrendListData)
@handler ListInspireElements
get /elements returns (InspireElementListData)
@handler SaveInspireElement
post /elements (InspireElementSaveReq) returns (InspireElementPublic)
@handler RemoveInspireElement
delete /elements/:id (InspireElementIdPath) returns (OkData)
@handler GetInspireSession
get /session returns (InspireSessionPublic)
@handler ClearInspireSession
post /session/clear returns (InspireSessionPublic)
@handler ListInspireSessions
get /sessions returns (InspireSessionListData)
@handler CreateInspireSession
post /sessions (InspireSessionCreateReq) returns (InspireSessionPublic)
@handler GetInspireSessionById
get /sessions/:id (InspireSessionIdPath) returns (InspireSessionPublic)
@handler ActivateInspireSession
post /sessions/:id/activate (InspireSessionIdPath) returns (InspireSessionPublic)
@handler DeleteInspireSession
delete /sessions/:id (InspireSessionIdPath) returns (InspireSessionPublic)
@handler InspireChat
post /chat (InspireChatReq) returns (InspireChatData)
@handler InspirePromptPreview
post /prompt-preview (InspirePromptPreviewReq) returns (InspirePromptPreviewData)
}
@server (
jwt: Auth
group: research
prefix: /api/v1/research
middleware: AuthJWT
)
service gateway {
@handler ResearchSearch
post /search (ResearchSearchReq) returns (ResearchSearchData)
}
@server (
jwt: Auth
group: media
prefix: /api/v1/media
middleware: AuthJWT
)
service gateway {
@handler GenerateImage
post /generate-image (GenerateImageReq) returns (GenerateImageData)
}
@server (
jwt: Auth
group: scout
prefix: /api/v1/scout
middleware: AuthJWT
)
service gateway {
@handler ListBrands
get /brands returns (BrandListData)
@handler SaveBrand
post /brands (BrandSaveReq) returns (BrandPublic)
@handler GetBrand
get /brands/:id (BrandIdPath) returns (BrandPublic)
@handler RemoveBrand
delete /brands/:id (BrandIdPath) returns (OkData)
@handler GetActiveBrand
get /brands-active returns (BrandActiveData)
@handler SetActiveBrand
post /brands-active (BrandSetActiveReq) returns (BrandActiveData)
@handler ListProducts
get /products (ProductListReq) returns (ProductListData)
@handler ListAllProducts
get /products/all returns (ProductListData)
@handler SaveProduct
post /products (ProductSaveReq) returns (ProductPublic)
@handler GetProduct
get /products/:id (ProductIdPath) returns (ProductPublic)
@handler RemoveProduct
delete /products/:id (ProductIdPath) returns (OkData)
@handler ImportProduct
post /products/import (ImportProductReq) returns (ImportProductData)
@handler PrepareBrief
post /brief (ScoutBriefReq) returns (ScoutBriefPublic)
@handler RunScan
post /scan (ScoutScanReq) returns (ScoutScanJobData)
@handler ListScoutPosts
get /posts (ScoutPostListReq) returns (ScoutPostListData)
@handler DraftOutreach
post /posts/:id/draft (ScoutDraftPathReq) returns (ScoutPostPublic)
@handler SkipOutreach
post /posts/:id/skip (ScoutPostIdPath) returns (ScoutPostPublic)
@handler MarkPublished
post /posts/:id/mark-published (ScoutPostIdPath) returns (ScoutPostPublic)
@handler SendOutreach
post /posts/:id/send (ScoutSendPathReq) returns (ScoutPostPublic)
@handler RemoveScoutPost
delete /posts/:id (ScoutPostIdPath) returns (OkData)
@handler RemoveScoutTheme
delete /themes/:themeKey (ScoutThemePath) returns (OkData)
@handler ListHomework
get /homework returns (ScoutHomeworkListData)
@handler SaveHomework
post /homework (ScoutHomeworkSaveReq) returns (ScoutHomeworkPublic)
@handler GetHomework
get /homework/:themeKey (ScoutThemePath) returns (ScoutHomeworkPublic)
@handler RemoveHomework
delete /homework/:themeKey (ScoutThemePath) returns (OkData)
@handler SetCrawlerSession
post /crawler-session (ScoutCrawlerSessionReq) returns (OkData)
@handler ClearCrawlerSession
delete /crawler-session returns (OkData)
}