[RFC] 017 - 插件支持 OpenAPI Schema(OpenAI 插件兼容) #585
Replies: 5 comments 3 replies
-
程序化覆盖所有 OpenAPI 调用的方案: 如果你希望通过OpenAPI规范中定义的操作ID来调用API,你可以使用Swagger Client的 const SwaggerClient = require('swagger-client');
// 假设已经知道操作ID和参数
const operationId = 'addPet'; // 这是OpenAPI规范中定义的操作ID
const parameters = {
// 这里填入你的API参数
body: {
id: 123,
name: 'Spot',
// 其他必要的pet属性...
}
};
// 初始化Swagger Client
SwaggerClient('http://petstore.swagger.io/v2/swagger.json')
.then(client => {
// 使用操作ID执行API调用
return client.execute({
operationId: operationId,
parameters: parameters
});
})
.then(response => {
console.log('API调用成功,响应:', response);
})
.catch(error => {
console.error('API调用失败:', error);
}); 在这个例子中,我们首先初始化Swagger Client并加载OpenAPI定义。然后,我们使用 请注意,传递给 这种方法的好处是你不需要关心API操作具体属于哪个标签,你只需要知道操作ID即可。确保操作ID是唯一的,这样Swagger Client才能正确地映射到相应的API操作。如果你的API需要认证,同样需要在Swagger Client初始化时提供认证信息。 |
Beta Was this translation helpful? Give feedback.
-
UI界面自定义插件那如何处理创建自定义插件? 首先如果是 lobeChat 插件,那么还是走上述的处理逻辑。相当于只是manifest中使用openapi定义api。 同时我们也需要支持解析 openai 的插件 manifest,将其转换为lobe插件的manifest。 展示 apis 数组考虑在ui插件部分展示其能力,即支持的调用方法。进而帮助用户了解插件的能力 后续再可以再考虑 api 颗粒度的开启或者关闭。 结果这样一来,lobe 的插件体系就可以初步达到一个新台阶,可以支持6种不同场景的插件需求:
|
Beta Was this translation helpful? Give feedback.
-
鉴权要添加必要的鉴权信息,你通常需要根据API的安全方案进行操作。在OpenAPI规范中,可以通过 在你提供的OpenAPI规范示例中,定义了一个名为 以下是如何在Swagger Client中添加API密钥的示例: const SwaggerClient = require('swagger-client');
// 假设已经知道操作ID和参数
const operationId = 'addPet';
const parameters = {
// API参数
};
// 设置API密钥
const apiKey = 'your_api_key_here';
// 初始化Swagger Client,并提供API密钥
SwaggerClient({
url: 'http://petstore.swagger.io/v2/swagger.json',
authorizations: {
apiKeyAuth: apiKey
}
})
.then(client => {
// 使用操作ID执行API调用
return client.execute({
operationId: operationId,
parameters: parameters
});
})
.then(response => {
console.log('API调用成功,响应:', response);
})
.catch(error => {
console.error('API调用失败:', error);
}); 在这个示例中,我们通过 这样,每次使用Swagger Client进行API调用时,它都会自动在HTTP请求头部加上 请注意,如果API使用的是其他类型的鉴权机制,如OAuth2或HTTP基本认证,你需要调整 |
Beta Was this translation helpful? Give feedback.
-
OpenAI 插件兼容三方的插件目录:https://www.futurepedia.io/ai-plugins/ 只需要做 OpenAI 插件到 Lobe 插件的转换即可。 OpenAI Plugin Manifest插件清单(Plugin Manifest)是OpenAI ChatGPT插件开发中的一个关键组成部分,它定义了插件的元数据。以下是插件清单的TypeScript类型定义示例: type HttpAuthorizationType = "bearer" | "basic";
interface BaseManifestAuth {
type: ManifestAuthType;
instructions: string;
}
interface ManifestNoAuth extends BaseManifestAuth {
type: 'none';
}
interface ManifestServiceHttpAuth extends BaseManifestAuth {
type: 'service_http';
authorization_type: HttpAuthorizationType;
verification_tokens: {
[service: string]?: string;
};
}
interface ManifestUserHttpAuth extends BaseManifestAuth {
type: 'user_http';
authorization_type: HttpAuthorizationType;
}
interface ManifestOAuthAuth extends BaseManifestAuth {
type: 'oauth';
client_url: string;
scope: string;
authorization_url: string;
authorization_content_type: string;
verification_tokens: {
[service: string]?: string;
};
}
type ManifestAuth =
| ManifestNoAuth
| ManifestServiceHttpAuth
| ManifestUserHttpAuth
| ManifestOAuthAuth;
interface PluginManifest {
schema_version: string;
name_for_model: string;
name_for_human: string;
description_for_model: string;
description_for_human: string;
auth: ManifestAuth;
api: {
type: string;
url: string;
};
logo_url: string;
contact_email: string;
legal_info_url: string;
// 其他可能的字段...
} 在创建插件时,开发者需要构建一个API,然后使用OpenAPI yaml或JSON格式记录API,并创建一个JSON格式的清单文件来定义插件的相关元数据。每个插件都需要一个 清单文件中的 开发者在命名插件时需要遵守OpenAI的品牌指南,并注意清单文件中各字段的字符限制,不遵守这些指南的插件将不会被批准进入插件商店。清单文件中的 在设计API响应时,最佳实践是保持描述和响应尽可能简洁,因为模型有限的上下文窗口。此外,插件API响应应当返回原始数据而非自然语言响应,除非必要,因为ChatGPT会使用返回的数据提供自己的自然语言响应。 |
Beta Was this translation helpful? Give feedback.
-
OpenAI 插件测试AskYourPDFWeb RewindACCESS LINKhttps://www.futurepedia.io/ai-plugins/access-link webpilot
https://www.futurepedia.io/ai-plugins/webpilot SEO |
Beta Was this translation helpful? Give feedback.
-
背景
我们需要兼容 OpenAI 的Plugin Manifest ,以复用 OpenAI 的插件生态。 #550
现状分析
兼容 OpenAI 插件体系,核心应该兼容什么?核心是 OpenAPI 。
目前的 LobeChat plugin manifest 中,核心需要用到的字段为
api
,用于传递 function-call 的入参配置。而 OpenAPI 的描述规范中也有该信息,因此只需要将其提取出来,然后替换为 LobeChat 的 api 字段即可。之前在设计 manifest时,就留有一个字段 openapi 用于存放外部的 openapi schema。
OpenAPI 的调用,可以直接使用 swagger-client 实现。
但是发给 gpt 的functions 必须要包含入参的基本描述。
因此可能的方案是,oneapi 模式下的请求,通过 swagger client 实现。
但需要每次解析一遍 openapi 来获取最新的 api 入参数组。
同时,由于一个openapi中的方法可能有非常多,因此可能也需要支持手动开关其中个别api。
因此剩下的问题就是 openapi 到 json schema 的转换问题。
目前看可能可以通过 https://github.com/openapi-contrib/openapi-schema-to-json-schema 这个库解决。
实现思路
swagger-client
支持相应的接口调用。传入 operationId(apiName) 和 parameters (lobehub/chat-plugins-gateway@605d9471ab32a6fb5a502282a80a945dc59167d8)getManifest
中,因此默认集成 )遗留问题:
认证/鉴权如何处理? 实现过程中已经遇到该问题。 在 [RFC] 017 - 插件支持 OpenAPI Schema(OpenAI 插件兼容) #585 (comment) 讨论
是否有必要将解析 manifest 的逻辑抽到sdk 里?
目前看还没有场景。 如果有场景,一定是解析和调用(gateways) 一同使用。譬如未来做一个 cli, 纯server调用 agent。解析 openapi 的逻辑过于复杂,抽到 sdk 里以隔离复杂性。跟进状态
Beta Was this translation helpful? Give feedback.
All reactions