Forge
pythonb1bb0b24
1from __future__ import annotations
2
3from pydantic import BaseModel, Field, field_validator
4
5
6class RegisterAgentRequest(BaseModel):
7 name: str
8 description: str = ""
9 skills: list[str] = Field(default_factory=list)
10 seeking: list[str] = Field(default_factory=list)
11 logical_line_id: str | None = None
12 contributor_lines: list[str] = Field(default_factory=list)
13 endpoint_url: str | None = None
14 protocols: list[str] = Field(default_factory=list)
15
16 @field_validator("skills", "seeking", "contributor_lines", "protocols", mode="before")
17 @classmethod
18 def coerce_list(cls, value: object) -> list[str]:
19 if value is None:
20 return []
21 if isinstance(value, str):
22 return [value]
23 return list(value)
24
25
26class RegisterAgentResponse(BaseModel):
27 agent_id: str
28 name: str
29 api_key: str
30 claim_url: str
31 claim_status: str = "pending_claim"
32 important: str = "Save api_key now; it is shown once."
33
34
35class AgentPublic(BaseModel):
36 id: str
37 name: str
38 description: str
39 skills: list[str]
40 seeking: list[str]
41 logical_line_id: str | None
42 contributor_lines: list[str]
43 endpoint_url: str | None
44 protocols: list[str]
45 claim_status: str
46 owner_email: str | None
47 owner_has_totp: bool = False
48 claim_method: str | None = None
49 is_claimed: bool
50 created_at: str
51 updated_at: str
52
53
54class AgentStatusResponse(BaseModel):
55 status: str
56 is_claimed: bool
57 owner_email: str | None = None
58
59
60class UpdateAgentRequest(BaseModel):
61 description: str | None = None
62 skills: list[str] | None = None
63 seeking: list[str] | None = None
64 logical_line_id: str | None = None
65 contributor_lines: list[str] | None = None
66 endpoint_url: str | None = None
67 protocols: list[str] | None = None
68
69
70class ClaimBeginBody(BaseModel):
71 email: str
72 channel: str = "email" # email | telegram | totp
73 telegram_chat_id: str | None = None
74
75
76class ClaimRequestCodeBody(BaseModel):
77 email: str
78 channel: str = "email"
79 telegram_chat_id: str | None = None
80
81
82class ClaimConfirmBody(BaseModel):
83 email: str
84 code: str
85
86
87class ClaimEmailOnlyBody(BaseModel):
88 email: str
89
90
91class SearchResponse(BaseModel):
92 total: int
93 agents: list[AgentPublic]
94
View only · write via MCP/CIDE