
Composio 自定義 Provider 開發指南為任意 AI 框架適配 Composio 工具【免費下載鏈接】composioComposio powers 1000 toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.項目地址: https://gitcode.com/GitHub_Trending/co/composio本指南系統講解如何在 Composio TypeScript SDK 中創建自定義 Provider提供者把 Composio 的 1000 工具適配到任意 AI 框架OpenAI、Anthropic、Google 等非智能體平臺以及 LangChain 等自帶智能體編排的平臺。讀完本文你將掌握 Provider 架構與類層次、非智能體Non-Agentic與智能體Agentic兩類 Provider 的完整實現套路、工具格式轉換與執行回調的注入原理并能基于倉庫內的官方實現OpenAI、Anthropic、LangChain舉一反三寫出自己的 Provider。文中所有代碼與結論均可在當前倉庫的ts/packages/core與ts/packages/providers目錄下找到實現依據。Provider 架構適配層解決了什么問題Composio SDK 的核心職責是把統一的工具執行能力認證、連接賬戶、參數校驗、執行日志以不同 AI 框架能理解的形式暴露出去。Provider 正是這一適配層工具格式轉換Tool Format Transformation將 Composio 內部統一的Tool結構轉換為特定 AI 平臺要求的工具描述格式。例如 OpenAI 的ChatCompletionTool、Anthropic 的input_schema、LangChain 的DynamicStructuredTool。工具執行Tool Execution通過executeTool方法管理工具調用的執行流程與結果回傳。平臺專屬集成Platform-Specific Integration提供executeToolCall、handleToolCalls等便捷方法把平臺返回的 tool call 對象直接翻譯成 Composio 可執行的調用。MCP Server 支持可選地對 MCP server 響應做格式轉換wrapMcpServerResponse。從源碼看Composio 內部對Tool的數據結構定義位于 ts/packages/core/src/types/tool.types.ts一個工具對象至少包含slug工具唯一標識如GOOGLE_SEARCH、name、可選的description、inputParameters入參 JSON Schema與outputParameters出參 Schema并可能攜帶toolkit、version、scopes、isNoAuth等元信息。你的 Provider 就是把這些字段映射為目標平臺的結構。兩類 ProviderNon-Agentic 與 Agentic根據目標平臺是否自帶智能體agency能力Provider 分為兩類類型適用平臺職責抽象基類Non-Agentic非智能體OpenAI、Anthropic、Google 等只提供函數調用function calling的平臺把工具轉換給 LLM 使用由你自己的代碼循環驅動模型反復調用BaseNonAgenticProviderAgentic智能體LangChain 等自帶 Agent 編排能力的框架除了轉換工具還要把ExecuteToolFn執行回調一起交給框架讓框架的 Agent 自主決定何時執行BaseAgenticProvider兩者的本質區別在抽象基類的方法簽名中體現得非常清楚。在 ts/packages/core/src/provider/BaseProvider.ts 中BaseNonAgenticProvider要求實現wrapTool(tool: Tool): TTool與wrapTools(tools: Tool[]): TToolCollection_isAgentic固定為falseBaseAgenticProvider要求實現wrapTool(tool: Tool, executeTool: ExecuteToolFn): TTool與wrapTools(tools: Tool[], executeTool: ExecuteToolFn): TToolCollection_isAgentic固定為true——多出的executeTool參數就是讓 Agent 框架自己執行工具的回調函數。ExecuteToolFn的類型定義在 ts/packages/core/src/types/provider.types.ts(toolSlug: string, input: Recordstring, unknown) PromiseToolExecuteResponse。Provider 類層次結構BaseProviderTMcpResponse (Abstract) ├── BaseNonAgenticProviderTToolCollection, TTool, TMcpResponse (Abstract) │ ├── OpenAIProvider (Concrete - 隨 composio/core 發布) │ ├── AnthropicProvider (Concrete - composio/anthropic) │ ├── GoogleProvider (Concrete - composio/google) │ └── [你的自定義 Non-Agentic Provider] (Concrete) └── BaseAgenticProviderTToolCollection, TTool, TMcpResponse (Abstract) ├── LangchainProvider (Concrete - composio/langchain) └── [你的自定義 Agentic Provider] (Concrete)BaseProvider抽象類是所有 Provider 的根定義了兩個抽象成員與一個可選的 MCP 鉤子abstract readonly name: stringProvider 的唯一名稱用于遙測telemetry識別例如openai、anthropic、langchain見 BaseProvider.tsabstract readonly _isAgentic: boolean由兩個子類自動設置wrapMcpServerResponse?(data: McpUrlResponse): TMcpResponse可選方法把 MCP URL 響應轉換為 Provider 特定格式若不實現則使用默認轉換該方法的文檔注釋標注為 deprecated未來會由wrapMcpServers取代。值得注意的還有基類中兩個面向Tool Router 會話的執行輔助方法assertToolCallExecutionOptions會在執行目標綁定到會話時拒絕 direct-only 配置executeToolForTarget則統一處理按 userId 直連工具 API與按 Tool Router 會話執行兩種執行路徑BaseProvider.ts。這意味著你實現的 Provider 只要正確使用這些內置方法就能同時兼容直連執行與會話執行兩種模式。創建 Non-Agentic Provider完整實戰非智能體 Provider 擴展BaseNonAgenticProvider。下面是根據原文檔整理并補充了注釋的完整實現import { BaseNonAgenticProvider, Tool, ToolExecuteParams, ExecuteToolModifiers, ExecuteToolFnOptions, McpUrlResponse, McpServerGetResponse, } from composio/core; // 定義你的工具格式目標平臺期望的結構 interface MyAITool { name: string; description: string; parameters: { type: string; properties: Recordstring, unknown; required?: string[]; }; } // 定義你的工具集合格式 type MyAIToolCollection MyAITool[]; // 可選定義自定義 MCP 響應格式 type MyAIMcpResponse { url: string; name: string; type: url; }[]; // 創建你的 Provider export class MyAIProvider extends BaseNonAgenticProvider MyAIToolCollection, MyAITool, MyAIMcpResponse { // 必填用于遙測的唯一 Provider 名稱 readonly name my-ai-platform; constructor() { super(); } // 必填將單個 Composio 工具轉換為目標平臺格式 override wrapTool(tool: Tool): MyAITool { return { name: tool.slug, description: tool.description || , parameters: { type: object, properties: tool.inputParameters?.properties || {}, required: tool.inputParameters?.required || [], }, }; } // 必填轉換整個工具集合 override wrapTools(tools: Tool[]): MyAIToolCollection { return tools.map(tool this.wrapTool(tool)); } // 可選把 MCP server 響應轉換為你的格式 wrapMcpServerResponse(data: McpUrlResponse): MyAIMcpResponse { return data.map(item ({ url: item.url, name: item.name, type: url, })); } // 可選為你的 AI 平臺提供便捷執行方法 async executeMyAIToolCall( userId: string, toolCall: { name: string; arguments: Recordstring, unknown; }, options?: ExecuteToolFnOptions, modifiers?: ExecuteToolModifiers ): Promisestring { // 使用內置的 executeTool 方法 const payload: ToolExecuteParams { arguments: toolCall.arguments, connectedAccountId: options?.connectedAccountId, customAuthParams: options?.customAuthParams, customConnectionData: options?.customConnectionData, userId: userId, }; const result await this.executeTool(toolCall.name, payload, modifiers); return JSON.stringify(result.data); } // 可選批量處理平臺返回的多個工具調用 async handleMyAIToolCalls( userId: string, toolCalls: Array{ name: string; arguments: Recordstring, unknown }, options?: ExecuteToolFnOptions, modifiers?: ExecuteToolModifiers ): Promisestring[] { const results await Promise.all( toolCalls.map(toolCall this.executeMyAIToolCall(userId, toolCall, options, modifiers)) ); return results; } }關鍵執行參數說明ToolExecuteParams是工具執行的核心入參其完整字段定義在 tool.types.ts字段類型說明argumentsRecordstring, unknown工具入參即模型根據工具 Schema 生成的參數對象connectedAccountIdstring可選指定使用哪個已連接的賬戶憑證執行customAuthParams可選自定義認證參數如動態 tokencustomConnectionData可選自定義連接數據userIdstring可選用戶標識用于認證與追蹤versionlatest \| string可選指定工具版本dangerouslySkipVersionCheckboolean可選跳過版本檢查allowTracing、text可選追蹤開關與文本參數ExecuteToolFnOptions定義于 provider.types.ts僅包含connectedAccountId、customAuthParams、customConnectionData三個可選字段——這正是在你的 helper 方法中透傳認證上下文的標準做法。executeTool 的注入原理this.executeTool()之所以可用是因為它并非你手動實現而是由 Composio 核心在初始化時注入的。在 ts/packages/core/src/models/Tools.ts 中Tools構造器執行this.execute this.execute.bind(this); // Set the execute method for the provider. this.provider._setExecuteToolFn(this.createExecuteFnForProviders());而BaseProvider.executeToolBaseProvider.ts在未注入_globalExecuteToolFn時會拋出ComposioGlobalExecuteToolFnNotSetError否則把調用轉交給該全局函數。也就是說工具的真實執行、認證處理、日志埋點全部由 Composio 核心負責Provider 只需構造參數并接收結果。這解釋了最佳實踐中始終使用this.executeTool()而不是自己實現執行邏輯的原因。創建 Agentic Provider把執行權交給框架智能體 Provider 擴展BaseAgenticProvider關鍵區別在于wrapTool/wrapTools會額外收到一個ExecuteToolFn回調你可以把它封裝進轉換后的工具對象里讓框架的 Agent 自行觸發執行import { BaseAgenticProvider, Tool, ExecuteToolFn, McpUrlResponse, McpServerGetResponse, } from composio/core; // 定義你的工具格式自帶 execute 函數 interface AgentTool { name: string; description: string; execute: (args: Recordstring, unknown) Promiseunknown; schema: Recordstring, unknown; } // 定義你的工具集合格式自帶 createAgent 工廠 interface AgentToolkit { tools: AgentTool[]; createAgent: (config: Recordstring, unknown) unknown; } // 可選定義自定義 MCP 響應格式 type MyAgentMcpResponse { url: URL; name: string; }[]; export class MyAgentProvider extends BaseAgenticProvider AgentToolkit, AgentTool, MyAgentMcpResponse { // 必填用于遙測的唯一 Provider 名稱 readonly name my-agent-platform; constructor() { super(); } // 必填轉換單個工具并把執行回調封裝進工具 override wrapTool(tool: Tool, executeToolFn: ExecuteToolFn): AgentTool { return { name: tool.slug, description: tool.description || , schema: tool.inputParameters || {}, execute: async (args: Recordstring, unknown) { const result await executeToolFn(tool.slug, args); if (!result.successful) { throw new Error(result.error || Tool execution failed); } return result.data; }, }; } // 必填轉換整個工具集合并附上 Agent 創建工廠 override wrapTools(tools: Tool[], executeToolFn: ExecuteToolFn): AgentToolkit { const agentTools tools.map(tool this.wrapTool(tool, executeToolFn)); return { tools: agentTools, createAgent: config { // 用這些工具創建 Agent實現取決于你的 Agent 框架 return { run: async (prompt: string) { // 框架的 Agent 會通過 tools.execute 觸發工具執行 console.log(Running agent with prompt: ${prompt}); }, }; }, }; } // 可選轉換 MCP server 響應 wrapMcpServerResponse(data: McpUrlResponse): MyAgentMcpResponse { return data.map(item ({ url: new URL(item.url), name: item.name, })); } // 可選便捷方法基于轉換后的工具集合運行 Agent async runAgent(agentToolkit: AgentToolkit, prompt: string): Promiseunknown { const agent agentToolkit.createAgent({}); return await agent.run(prompt); } }注意這里對result.successful與result.error的判斷。ToolExecuteResponse的結構tool.types.ts為{ data, error, successful, logId?, sessionInfo? }——successful布爾值、error可空字符串、data為執行結果這是你在任何 Provider 中判斷工具執行成敗的統一契約。使用自定義 Provider創建完成后通過Composio構造器的provider選項接入import { Composio } from composio/core; import { MyAIProvider } from ./my-ai-provider; // 創建 Provider 實例 const myProvider new MyAIProvider(); // 用自定義 Provider 初始化 Composio const composio new Composio({ apiKey: your-composio-api-key, provider: myProvider, }); // 獲取工具——它們會經過你的 Provider 轉換 const tools await composio.tools.get(default, { toolkits: [github], }); // 在目標平臺上使用這些工具 console.log(tools); // 此時已經是你的自定義格式從 ts/packages/core/src/composio.ts 的構造器實現可以看到config.provider未提供時默認使用new OpenAIProvider()。也就是說OpenAIProvider 是開箱即用的默認適配器它隨composio/core一起發布實現位于 ts/packages/core/src/provider/OpenAIProvider.ts而 Anthropic、Google、LangChain 等則作為獨立包提供。tools.get返回的集合類型與你的 Provider 泛型參數完全對應——返回的就是MyAIToolCollection。Provider 狀態與上下文Provider 實例由你創建、由 Composio 持有因此它可以維護自己的內部狀態。這在需要統計、緩存、配置化轉換時非常有用export class StatefulProvider extends BaseNonAgenticProviderToolCollection, Tool { readonly name stateful-provider; // Provider 內部狀態 private requestCount 0; private toolCache new Mapstring, any(); private config: ProviderConfig; constructor(config: ProviderConfig) { super(); this.config config; } override wrapTool(tool: Tool): ProviderTool { this.requestCount; // 結合狀態與配置進行轉換 const enhancedTool { name: this.config.useUpperCase ? tool.slug.toUpperCase() : tool.slug, description: tool.description, schema: tool.inputParameters, }; // 緩存轉換結果 this.toolCache.set(tool.slug, enhancedTool); return enhancedTool; } override wrapTools(tools: Tool[]): ProviderToolCollection { return tools.map(tool this.wrapTool(tool)); } // 暴露狀態的輔助方法 getRequestCount(): number { return this.requestCount; } getCachedTool(slug: string): ProviderTool | undefined { return this.toolCache.get(slug); } }狀態化設計在官方實現中也有先例AnthropicProvider維護了cacheTools開關啟用 Anthropic ephemeral prompt caching在wrapTool中為工具追加cache_control: { type: ephemeral }和一張toolKeyMappings映射表用于把違反 Anthropic 參數命名約束^[a-zA-Z0-9_.-]{1,64}$的鍵名做 sanitize/restore 雙向還原見 ts/packages/providers/anthropic/src/index.ts。可見同一個 Provider 實例先 wrap 再執行是這類狀態機制得以工作的前提。高級Provider 組合與繼承擴展不必從零開始——你可以通過繼承官方已有 Provider 來疊加能力。下面示例在OpenAIProvider基礎上增加了調用計數統計與指數退避重試import { OpenAIProvider } from composio/openai; export class EnhancedOpenAIProvider extends OpenAIProvider { // 追加屬性 private analytics { toolCalls: 0, errors: 0, }; // 覆寫方法以增強功能 override async executeToolCall(userId, tool, options, modifiers) { this.analytics.toolCalls; try { const result await super.executeToolCall(userId, tool, options, modifiers); return result; } catch (error) { this.analytics.errors; throw error; } } // 新增方法 getAnalytics() { return this.analytics; } async executeWithRetry(userId, tool, options, modifiers, maxRetries 3) { let attempts 0; let lastError; while (attempts maxRetries) { try { return await this.executeToolCall(userId, tool, options, modifiers); } catch (error) { lastError error; attempts; await new Promise(resolve setTimeout(resolve, 1000 * attempts)); } } throw lastError; } }這種組合模式的價值在于OpenAIProvider內部已經處理了normalizeToolArguments容忍模型把參數序列化成 JSON 字符串、空對象等情況見 OpenAIProvider.ts與deduplicateJsonSchemaRequiredArrays去重 JSON Schema 中的 required 數組等細節你只需要聚焦增量邏輯。示例Anthropic Claude Provider真實實現參考以下代碼是基于倉庫中 ts/packages/providers/anthropic/src/index.ts 官方實現的真實形態整理的完整示例展示了 Non-Agentic Provider 的完整形態包括工具轉換、tool_use塊解析、批量處理與緩存控制import { BaseNonAgenticProvider, Tool, ToolExecuteParams, ExecuteToolModifiers, ExecuteToolFnOptions, McpUrlResponse, } from composio/core; import Anthropic from anthropic-ai/sdk; // 定義 Anthropic 工具格式 interface AnthropicTool { name: string; description: string; input_schema: { type: string; properties: Recordstring, unknown; required?: string[]; }; cache_control?: { type: ephemeral }; } type AnthropicToolCollection AnthropicTool[]; // 定義 tool use 塊類型 interface AnthropicToolUseBlock { type: tool_use; id: string; name: string; input: Recordstring, unknown; } // 定義 Anthropic 的 MCP server 響應格式 type AnthropicMcpServerGetResponse { type: url; url: string; name: string; }[]; export class AnthropicProvider extends BaseNonAgenticProvider AnthropicToolCollection, AnthropicTool, AnthropicMcpServerGetResponse { readonly name anthropic; private cacheTools: boolean false; constructor(options?: { cacheTools?: boolean }) { super(); this.cacheTools options?.cacheTools ?? false; } override wrapTool(tool: Tool): AnthropicTool { return { name: tool.slug, description: tool.description || , input_schema: (tool.inputParameters || { type: object, properties: {}, required: [], }) as any, cache_control: this.cacheTools ? { type: ephemeral } : undefined, }; } override wrapTools(tools: Tool[]): AnthropicToolCollection { return tools.map(tool this.wrapTool(tool)); } // 將 MCP URL 響應轉換為 Anthropic 特定格式 wrapMcpServerResponse(data: McpUrlResponse): AnthropicMcpServerGetResponse { return data.map(item ({ url: item.url, name: item.name, type: url, })); } // 執行單個 Anthropic 工具調用 async executeToolCall( userId: string, toolUse: AnthropicToolUseBlock, options?: ExecuteToolFnOptions, modifiers?: ExecuteToolModifiers ): Promisestring { const payload: ToolExecuteParams { arguments: toolUse.input, connectedAccountId: options?.connectedAccountId, customAuthParams: options?.customAuthParams, customConnectionData: options?.customConnectionData, userId: userId, }; const result await this.executeTool(toolUse.name, payload, modifiers); return JSON.stringify(result.data); } // 處理 Anthropic 消息響應中的工具調用 async handleToolCalls( userId: string, message: Anthropic.Message, options?: ExecuteToolFnOptions, modifiers?: ExecuteToolModifiers ): PromiseAnthropic.Messages.MessageParam[] { const outputs: Anthropic.Messages.ToolResultBlockParam[] []; // 從消息內容中提取 tool use 塊 const toolUseBlocks: AnthropicToolUseBlock[] []; for (const content of message.content) { if ( typeof content object content ! null type in content content.type tool_use id in content name in content input in content ) { toolUseBlocks.push({ type: tool_use, id: String(content.id), name: String(content.name), input: content.input as Recordstring, unknown, }); } } // 逐個執行工具調用 for (const toolUse of toolUseBlocks) { const toolResult await this.executeToolCall(userId, toolUse, options, modifiers); outputs.push({ type: tool_result, tool_use_id: toolUse.id, content: toolResult, cache_control: this.cacheTools ? { type: ephemeral } : undefined, }); } return outputs.length 0 ? [{ role: user, content: outputs }] : []; } }官方實現中還包含一個值得借鑒的工程細節在wrapTool階段先通過dereferenceJsonSchema內聯$ref/$defs引用對未解析的引用以寬松 Schema 兜底而非拋錯再做鍵名 sanitize并在executeToolCall階段還原原始鍵名anthropic/src/index.ts。如果你的目標平臺對參數命名有嚴格約束可以參照這一包裝時改寫、執行時還原的雙向映射方案。示例LangChain Provider真實實現參考LangChain 是官方提供的 Agentic Provider 代表。下面是基于 ts/packages/providers/langchain/src/index.ts 官方實現整理的完整形態import { BaseAgenticProvider, jsonSchemaToZodSchema, Tool, ExecuteToolFn, McpUrlResponse, McpServerGetResponse, } from composio/core; import { DynamicStructuredTool } from langchain/core/tools; export type LangChainToolCollection ArrayDynamicStructuredTool; export class LangchainProvider extends BaseAgenticProvider LangChainToolCollection, DynamicStructuredTool { readonly name langchain; constructor() { super(); } // 將 MCP URL 響應轉換為標準格式 wrapMcpServerResponse(data: McpUrlResponse): McpServerGetResponse { return data.map(item ({ url: new URL(item.url), name: item.name, })) as McpServerGetResponse; } override wrapTool(tool: Tool, executeTool: ExecuteToolFn): DynamicStructuredTool { const toolName tool.slug; const description tool.description; const appName tool.toolkit?.name?.toLowerCase(); if (!appName) { throw new Error(App name is not defined); } if (!tool.inputParameters) { throw new Error(Tool input parameters are not defined); } // 將 JSON Schema 轉換為 LangChain 使用的 Zod Schema const parameters jsonSchemaToZodSchema(tool.inputParameters); const func async (...args: unknown[]): Promiseunknown { const result await executeTool(toolName, args[0] as Recordstring, unknown); return JSON.stringify(result); }; return new DynamicStructuredTool({ name: toolName, description: description || , schema: parameters, func: func, }); } override wrapTools(tools: Tool[], executeTool: ExecuteToolFn): LangChainToolCollection { return tools.map(tool this.wrapTool(tool, executeTool)); } }官方實現還額外做了兩件事先用dereferenceJsonSchema(tool.inputParameters, { onUnresolved: sentinel })處理 Schema 中的引用再用normalizeToolArguments(args[0], toolName)兼容模型把入參以 JSON 字符串形式輸出的情況langchain/src/index.ts。jsonSchemaToZodSchema與dereferenceJsonSchema工具函數在composio/core中導出倉庫內也有獨立的 JSON Schema 轉 Zod 包ts/packages/json-schema-to-zod供復用。在 LangChain 中使用該 Providerimport { Composio } from composio/core; import { LangchainProvider } from composio/langchain; import { ChatOpenAI } from langchain/openai; import { AgentExecutor, createOpenAIFunctionsAgent } from langchain/agents; import { ChatPromptTemplate, MessagesPlaceholder } from langchain/core/prompts; // 用 LangChain Provider 初始化 Composio const composio new Composio({ apiKey: your-composio-api-key, provider: new LangchainProvider() }); // 獲取 LangChain 格式的工具 const tools await composio.tools.get(user123, { toolkits: [github] }); // 創建 LangChain Agent const llm new ChatOpenAI({ modelName: gpt-4, temperature: 0 }); const prompt ChatPromptTemplate.fromMessages([ [system, You are a helpful assistant with access to GitHub tools.], [human, {input}], new MessagesPlaceholder(agent_scratchpad) ]); const agent await createOpenAIFunctionsAgent({ llm, tools, prompt }); const agentExecutor new AgentExecutor({ agent, tools, verbose: true }); // 使用 Agent const result await agentExecutor.invoke({ input: Create a new GitHub repository called my-project }); console.log(result.output);注意這里的composio.tools.get(...)返回的tools已經是DynamicStructuredTool[]可以直接傳給 LangChain 的createOpenAIFunctionsAgent與AgentExecutor——Agentic Provider 的價值就在于此工具轉換與執行回調在初始化時已全部就緒LangChain 的 Agent 循環會自動調用tools.execute完成真實的工具執行并拿到結果繼續推理。最佳實踐清單保持 Provider 聚焦每個 Provider 只針對一個特定平臺做集成職責單一。優雅處理錯誤在 helper 方法中捕獲并轉換工具執行錯誤例如在execute包裝函數中對result.successful false拋出攜帶result.error的異常。遵循平臺約定采用目標平臺的命名與結構慣例如 OpenAI 的{type: function, function: {...}}、Anthropic 的input_schema、LangChain 的DynamicStructuredTool。正確使用 TypeScript 泛型通過三個泛型參數TToolCollection、TTool、TMcpResponse保證工具格式的類型安全。添加輔助方法為常見平臺操作提供便捷方法如executeToolCall單次調用與handleToolCalls批量調用它們應能直接消費平臺返回的 tool call 結構。支持 MCP Server若平臺需要自定義 MCP server 響應格式實現wrapMcpServerResponse。始終使用內置 executeTool工具執行一律走this.executeTool()其底層由Tools構造器注入_setExecuteToolFn不要自行實現執行與認證邏輯。提供清晰文檔為你的 Provider 的獨特特性與使用模式編寫文檔與示例。使用有意義的 Provider 名稱name會進入遙測數據命名應清晰可辨官方使用小寫平臺名openai、anthropic、langchain。正確處理認證通過ExecuteToolFnOptions透傳connectedAccountId、customAuthParams、customConnectionData確保工具執行時能帶上正確的賬戶憑證。關鍵實現筆記Non-Agentic Provider接收工具并轉換為目標平臺可直接使用的格式執行循環由你自己的應用代碼驅動Agentic Provider同時接收工具和ExecuteToolFn回調把執行能力交給框架的 Agent 自主編排executeTool由 Composio 核心注入Tools.ts統一負責認證與執行邏輯未注入時拋出ComposioGlobalExecuteToolFnNotSetErrorMCP server 支持是可選的但對需要自定義響應格式的平臺強烈推薦實現wrapMcpServerResponse所有 Provider 都應擴展對應的抽象基類并實現其必填抽象方法wrapTool/wrapTools基類與類型定義集中在 ts/packages/core/src/provider/BaseProvider.ts 與 ts/packages/core/src/types/provider.types.ts倉庫內置的ComposioProviderComposioProvider.ts是一個最小實現范例OpenAIProviderOpenAIProvider.ts則是默認適配器兩者都值得在動手前通讀一遍。【免費下載鏈接】composioComposio powers 1000 toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.項目地址: https://gitcode.com/GitHub_Trending/co/composio創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考