深入解析 Continue SDK 的 ListAssistants200ResponseInner 数据模型:在 Continue Hub IDE API 中消费 Assistant 列表
【免费下载链接】continueopen-source coding agent项目地址: https://gitcode.com/GitHub_Trending/co/continue
导读
ListAssistants200ResponseInner是 Continue 开源编码助手(open-source coding agent)项目 continue-sdk 中Continue Hub IDE API的响应数据模型之一,用于描述GET /ide/list-assistants接口返回的单个 Agent(助手)条目。本篇指南以该模型的 OpenAPI 定义、Python 客户端源码与测试用例为依据,系统讲解其 7 个字段的语义与 JSON 映射关系、嵌套的配置加载结果结构,以及如何在 Python SDK 中完成反序列化与序列化,帮助你在接入 Continue Hub 时正确解析、展示与使用 Agent 列表。
一、模型在 Continue 生态中的位置
Continue 是一个开源编码助手项目,其 IDE 扩展(VS Code 与 JetBrains)需要从 Continue Hub 服务端拉取可用的 Assistant(Agent)列表及其完整配置。这个能力由Continue Hub IDE API提供,API 基线地址为https://api.continue.dev(本地开发时也可使用http://localhost:3001),这些端点由 packages/continue-sdk/openapi.yaml 定义,并据此生成多语言 SDK。
在 packages/continue-sdk/openapi.yaml 中,GET /ide/list-assistants的 200 响应是一个数组,数组中每个元素即为ListAssistants200ResponseInner模型:
- 它返回用户可用的全部 Agent 列表,携带完整配置、图标和其他 IDE 展示与使用所需的元数据;
- 该端点会执行一次全量刷新,包括对配置进行"unrolling"(展开/扁平化)以及解析 secrets;
- 请求时可通过两个可选查询参数进行控制:
alwaysUseProxy(是否始终使用 Continue 托管的模型代理,取值"true"/"false")与organizationId(组织作用域,不传时返回个人 Agent); - 认证方式为 Bearer 认证(
apiKeyAuth)。
在生成的客户端中,该方法位于DefaultApi.list_assistants(),其返回类型为List[ListAssistants200ResponseInner],状态码映射为200(成功)、401(认证失败)、404(用户不存在),参见 default_api.py 与 DefaultApi.md。
二、字段总览:7 个属性的完整语义
依据 ListAssistants200ResponseInner.md 的属性表,并结合 OpenAPI 定义 openapi.yaml,该模型包含 3 个必填字段与 4 个可选字段:
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
config_result(configResult) | ListAssistants200ResponseInnerConfigResult | 是 | 该 Agent 的配置加载结果(含展开后的配置、加载中断标记与错误列表) |
owner_slug(ownerSlug) | str | 是 | 拥有该 Agent 的用户或组织的 Slug |
package_slug(packageSlug) | str | 是 | Agent 包的 Slug |
icon_url(iconUrl) | str | 可选 | Agent 图标的预签名 URL |
on_prem_proxy_url(onPremProxyUrl) | str | 可选 | 组织使用本地(on-premises)代理时的代理 URL |
use_on_prem_proxy(useOnPremProxy) | bool | 可选 | 组织是否使用本地代理 |
raw_yaml(rawYaml) | str | 可选 | Agent 的原始 YAML 配置 |
说明:表格中括号内为JSON 字段名(alias)。该 SDK 遵循 camelCase 的 JSON 命名,而 Python 属性使用 snake_case,二者由 Pydantic 的
alias机制完成映射。
必填字段的校验逻辑
在 Python 模型 list_assistants200_response_inner.py 中,必填字段由类型注解决定(无默认值),可选字段均带有default=None且类型为Optional:
config_result必须是ListAssistants200ResponseInnerConfigResult实例;owner_slug、package_slug使用StrictStr,强制要求字符串类型,传入非字符串会触发校验错误;- 四个可选字段都允许
None。
TypeScript 版本的接口定义同样将configResult、ownerSlug、packageSlug设为必填,并提供了instanceOfListAssistants200ResponseInner运行时校验函数,见 ListAssistants200ResponseInner.ts。
三、嵌套模型:配置加载结果config_result
config_result是本模型中最关键的嵌套结构,独立成模型ListAssistants200ResponseInnerConfigResult,其属性表见 ListAssistants200ResponseInnerConfigResult.md:
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
config | object | 是 | 展开(unrolled)后的 Agent 配置 |
config_load_interrupted(configLoadInterrupted) | bool | 是 | 配置加载是否被中断 |
errors | List[str] | 可选 | 配置加载过程中发生的任何错误 |
在 OpenAPI 定义中,config被标记为nullable: true,errors同样可空(openapi.yaml),对应 Python 模型中config: Optional[Dict[str, Any]]、errors: Optional[List[StrictStr]],而config_load_interrupted为StrictBool(list_assistants200_response_inner_config_result.py)。
这一嵌套结构的设计意图可以从端点描述中读出:list_assistants会做全量刷新 + 配置 unrolling + secrets 解析(见 default_api.py),因此响应不仅要携带 Agent 元信息,还要带上"这份配置到底加载得怎么样了"的诊断结果:
config承载最终可用的展开配置;config_load_interrupted标记加载过程是否被打断(例如超时或资源限制),客户端可据此决定是否降级展示;errors给出加载期间的具体错误信息,便于排查。
四、JSON 与 Python 对象的双向转换
该模型由 OpenAPI Generator 基于 Pydantic v2 生成,围绕 JSON 提供了四个核心方法(list_assistants200_response_inner.py):
from openapi_client.models.list_assistants200_response_inner import ListAssistants200ResponseInner # TODO update the JSON string below json = "{}" # create an instance of ListAssistants200ResponseInner from a JSON string list_assistants200_response_inner_instance = ListAssistants200ResponseInner.from_json(json) # print the JSON string representation of the object print(ListAssistants200ResponseInner.to_json()) # convert the object into a dict list_assistants200_response_inner_dict = list_assistants200_response_inner_instance.to_dict() # create an instance of ListAssistants200ResponseInner from a dict list_assistants200_response_inner_from_dict = ListAssistants200ResponseInner.from_dict(list_assistants200_response_inner_dict)各方法的行为要点:
from_json(json_str)先将 JSON 字符串json.loads为字典,再委托给from_dict;from_dict(obj)对configResult递归调用ListAssistants200ResponseInnerConfigResult.from_dict,其余字段按 JSON 别名(ownerSlug、packageSlug、iconUrl、onPremProxyUrl、useOnPremProxy、rawYaml)直接取值;to_dict()使用by_alias=True输出 camelCase 键名,并保证configResult通过其自身的to_dict()递归序列化;同时只对"初始化时显式设置为None的可空字段"输出None值(exclude_none=True),其余未设置字段会被省略;to_str()/to_json()分别输出带别名的格式化字符串与 JSON 字符串。
在真实调用场景中,from_dict并不需要你手写——SDK 的DefaultApi.list_assistants()返回的响应对象会自动完成反序列化。你可以这样消费:
import openapi_client from openapi_client.rest import ApiException from pprint import pprint # The client must configure the authentication and authorization parameters # in accordance with the API server security policy. configuration = openapi_client.Configuration( access_token = os.environ["BEARER_TOKEN"] ) with openapi_client.ApiClient(configuration) as api_client: api_instance = openapi_client.DefaultApi(api_client) # 可选:始终使用 Continue 托管代理;按组织作用域过滤 # always_use_proxy = 'true' # organization_id = 'org_example' try: api_response = api_instance.list_assistants() for assistant in api_response: # 必填元信息 print(assistant.owner_slug, assistant.package_slug) # 嵌套配置加载结果 if assistant.config_result is not None: print("interrupted:", assistant.config_result.config_load_interrupted) print("errors:", assistant.config_result.errors) # 可选元信息 print("icon:", assistant.icon_url, "raw_yaml:", assistant.raw_yaml) except Exception as e: print("Exception when calling DefaultApi->list_assistants: %s\n" % e)五、字段在真实响应中的典型形态
综合 OpenAPI 定义与测试存根(test_list_assistants200_response_inner.py),一份典型的 200 响应元素如下:
{ "configResult": { "config": { "name": "my-agent", "description": "Example agent", "model": "gpt-4o", "prompt": "You are a helpful coding assistant." }, "configLoadInterrupted": false, "errors": null }, "ownerSlug": "alice", "packageSlug": "code-reviewer", "iconUrl": "https://cdn.continue.dev/icons/xxx.png", "onPremProxyUrl": null, "useOnPremProxy": false, "rawYaml": "name: my-agent\nmodel: gpt-4o\nprompt: You are a helpful coding assistant." }字段间的配合逻辑可以归纳为:ownerSlug+packageSlug共同构成 Agent 的全局唯一标识(对应GET /ide/get-assistant/{ownerSlug}/{packageSlug}的单条查询端点,见 DefaultApi.md);iconUrl用于 IDE 列表中的头像展示;onPremProxyUrl与useOnPremProxy描述组织级代理链路;rawYaml保留 Agent 的原始配置文本,供高级用户查看或本地复制;configResult则给出服务端展开后的最终配置与加载诊断。
六、模型的生成来源与工程约束
需要特别指出:ListAssistants200ResponseInner不是手写的业务类,而是由 OpenAPI Generator 从 packages/continue-sdk/openapi.yaml 自动生成的,Python 与 TypeScript 两套 SDK 同源同构:
- Python 实现:
packages/continue-sdk/python/api/openapi_client/models/list_assistants200_response_inner.py; - TypeScript 实现:
packages/continue-sdk/typescript/api/src/models/ListAssistants200ResponseInner.ts。
因此存在两条工程约定:
- 不要手工修改生成文件。所有模型文件的头部均标注 "Do not edit the class manually"(如 list_assistants200_response_inner.py)。如需调整字段,应修改
openapi.yaml中的 schema 后重新生成。 - Pydantic v2 语义。模型基于
BaseModel+ConfigDict(populate_by_name=True, validate_assignment=True)构建(list_assistants200_response_inner.py),即:既可按 JSON 别名(configResult)也可按 Python 属性名(config_result)赋值;赋值时会实时校验类型。序列化时默认输出 camelCase 别名,这正是"文档属性名与 JSON 键名不同"的根因。
七、小结与使用建议
ListAssistants200ResponseInner是 Continue Hub IDE API 中 Agent 列表响应的最小组成单元,理解它能帮你:
- 在 IDE 扩展或自研工具中正确解析与渲染
GET /ide/list-assistants的返回值; - 通过
configResult感知配置加载是否被中断、存在哪些错误,从而做出合理的降级提示; - 利用
ownerSlug+packageSlug的组合唯一标识 Agent,并配合get_assistant端点实现按需刷新单条配置,避免频繁全量拉取。
进一步阅读:端点完整定义见 DefaultApi.md,API 服务描述见 openapi.yaml,TypeScript 侧对等接口见 ListAssistants200ResponseInner.ts,单元测试存根见 test_list_assistants200_response_inner.py。
【免费下载链接】continueopen-source coding agent项目地址: https://gitcode.com/GitHub_Trending/co/continue
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考