From c493d4ef58653017542c8f2c71884fd984f01727 Mon Sep 17 00:00:00 2001 From: "Junyan Qin (Chin)" Date: Mon, 10 Nov 2025 23:12:48 +0800 Subject: [PATCH] V4.5.0 (#68) * doc: add service api refs (#67) * doc: add service api refs * fix: page title * docs: add Service API overview and images, mark as Beta * doc: update for plugin system on windows * docs: perf * doc: add pipeline plugin comments --- docs/.vitepress/config.mts | 53 +- docs/.vitepress/theme/index.ts | 69 +- docs/assets/image/zh/api/copy_api_key.png | Bin 0 -> 58671 bytes docs/assets/image/zh/api/create_api_key.png | Bin 0 -> 83069 bytes .../image/zh/plugin/install_from_local.png | Bin 23498 -> 0 bytes .../assets/image/zh/plugin/install_method.png | Bin 0 -> 6292 bytes .../image/zh/plugin/pipeline_extensions.png | Bin 0 -> 43198 bytes docs/assets/service-api-openapi-en.json | 1944 +++++++++++++++++ docs/assets/service-api-openapi-zh.json | 1944 +++++++++++++++++ docs/en/deploy/langbot/manual.md | 26 +- docs/en/plugin/compatibility.md | 6 +- docs/en/plugin/plugin-intro.md | 14 +- docs/en/tags/[operationId].md | 13 + docs/en/tags/[operationId].paths.mts | 18 + docs/en/tags/[tag].md | 16 + docs/en/tags/[tag].paths.mts | 17 + docs/en/tags/readme.md | 21 + docs/zh/deploy/langbot/manual.md | 40 +- docs/zh/plugin/compatibility.md | 8 +- docs/zh/plugin/plugin-intro.md | 16 +- docs/zh/tags/[operationId].md | 13 + docs/zh/tags/[operationId].paths.mts | 18 + docs/zh/tags/[tag].md | 16 + docs/zh/tags/[tag].paths.mts | 18 + docs/zh/tags/readme.md | 21 + package.json | 3 +- pnpm-lock.yaml | 204 ++ 27 files changed, 4406 insertions(+), 92 deletions(-) create mode 100644 docs/assets/image/zh/api/copy_api_key.png create mode 100644 docs/assets/image/zh/api/create_api_key.png delete mode 100644 docs/assets/image/zh/plugin/install_from_local.png create mode 100644 docs/assets/image/zh/plugin/install_method.png create mode 100644 docs/assets/image/zh/plugin/pipeline_extensions.png create mode 100644 docs/assets/service-api-openapi-en.json create mode 100644 docs/assets/service-api-openapi-zh.json create mode 100644 docs/en/tags/[operationId].md create mode 100644 docs/en/tags/[operationId].paths.mts create mode 100644 docs/en/tags/[tag].md create mode 100644 docs/en/tags/[tag].paths.mts create mode 100644 docs/en/tags/readme.md create mode 100644 docs/zh/tags/[operationId].md create mode 100644 docs/zh/tags/[operationId].paths.mts create mode 100644 docs/zh/tags/[tag].md create mode 100644 docs/zh/tags/[tag].paths.mts create mode 100644 docs/zh/tags/readme.md diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 25f403678..c0150f18f 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,4 +1,17 @@ import { defineConfig } from "vitepress"; +import { useSidebar } from "vitepress-openapi"; +import specZh from '../assets/service-api-openapi-zh.json' with { type: 'json' } +import specEn from '../assets/service-api-openapi-en.json' with { type: 'json' } + +const sidebarZh = useSidebar({ + spec: specZh, + linkPrefix: '/zh/tags/', +}) + +const sidebarEn = useSidebar({ + spec: specEn, + linkPrefix: '/en/tags/', +}) // https://vitepress.dev/reference/site-config export default defineConfig({ @@ -202,15 +215,16 @@ export default defineConfig({ ], }, { text: "迁移指南", link: "/zh/plugin/dev/migration" }, - { text: "分发插件", collapsed: true, + { + text: "分发插件", collapsed: true, items: [ { text: "发布到插件市场", link: "/zh/plugin/dev/publish/market" }, { text: "通过 GitHub 分发", link: "/zh/plugin/dev/publish/github" }, ] - }, + }, ], }, - { text: "系统兼容性", link: "/zh/plugin/compatibility" }, + { text: "系统兼容处理", link: "/zh/plugin/compatibility" }, ], }, { @@ -246,6 +260,18 @@ export default defineConfig({ } ], }, + { + text: "[Beta] Service API 参考", + items: [ + { text: "概述", link: "/zh/tags/readme" }, + ...sidebarZh.generateSidebarGroups({ + linkPrefix: '/zh/tags/', + }).map(group => ({ + ...group, + collapsed: true, // Collapsible and open by default. + })), + ], + }, { text: "开发", items: [ @@ -459,12 +485,13 @@ export default defineConfig({ ], }, { text: "Migration Guide", link: "/en/plugin/dev/migration" }, - { text: "Distribute Plugin", collapsed: true, + { + text: "Distribute Plugin", collapsed: true, items: [ { text: "Publish to Marketplace", link: "/en/plugin/dev/publish/market" }, { text: "Distribute via GitHub", link: "/en/plugin/dev/publish/github" }, ] - }, + }, ], }, { text: "System Compatibility", link: "/en/plugin/compatibility" }, @@ -482,8 +509,8 @@ export default defineConfig({ // link: "/en/workshop/mcp-details" // }, { - text: "Container Network Configuration Details", - link: "/en/workshop/network-details", + text: "Container Network Configuration Details", + link: "/en/workshop/network-details", }, { text: "Using New API to Transmit Models from Multiple Channels", @@ -499,6 +526,18 @@ export default defineConfig({ } ], }, + { + text: "[Beta] Service API Reference", + items: [ + { text: "Overview", link: "/en/tags/readme" }, + ...sidebarEn.generateSidebarGroups({ + linkPrefix: '/en/tags/', + }).map(group => ({ + ...group, + collapsed: true, + })), + ], + }, { text: "Development", items: [ diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index b3579b9da..bb041d3a6 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,5 +1,72 @@ // .vitepress/theme/index.ts import DefaultTheme from 'vitepress/theme' import './custom.css' +import { theme, useOpenapi } from 'vitepress-openapi/client' +import 'vitepress-openapi/dist/style.css' -export default DefaultTheme \ No newline at end of file +import specZh from '../../assets/service-api-openapi-zh.json' +import specEn from '../../assets/service-api-openapi-en.json' + +export default { + extends: DefaultTheme, + enhanceApp({ app, router, siteData }) { + // Determine which spec to use based on the current route + const getSpec = () => { + // Check if we're in the Chinese or English version + if (typeof window !== 'undefined') { + const path = window.location.pathname + return path.startsWith('/zh') ? specZh : specEn + } + // Default to Chinese spec for SSR + return specZh + } + + const getLocale = () => { + if (typeof window !== 'undefined') { + const path = window.location.pathname + return path.startsWith('/zh') ? 'zh' : 'en' + } + return 'zh' + } + + // Register the openapi spec with custom configuration + useOpenapi({ + spec: getSpec(), + config: { + // Allow users to customize the server URL in the playground + server: { + allowCustomServer: true, + }, + // Set locale based on current language + i18n: { + locale: getLocale(), + fallbackLocale: 'en', + }, + }, + }) + + // Update spec when route changes + if (router) { + router.onAfterRouteChanged = (to) => { + const newSpec = to.startsWith('/zh') ? specZh : specEn + const newLocale = to.startsWith('/zh') ? 'zh' : 'en' + + useOpenapi({ + spec: newSpec, + config: { + server: { + allowCustomServer: true, + }, + i18n: { + locale: newLocale, + fallbackLocale: 'en', + }, + }, + }) + } + } + + // Then enhance the app with the theme + theme.enhanceApp({ app, router, siteData }) + } +} \ No newline at end of file diff --git a/docs/assets/image/zh/api/copy_api_key.png b/docs/assets/image/zh/api/copy_api_key.png new file mode 100644 index 0000000000000000000000000000000000000000..01f9bfa0bdc9bf15623a50178dbb734bd3f4da9f GIT binary patch literal 58671 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 literal 0 HcmV?d00001 diff --git a/docs/assets/image/zh/plugin/install_from_local.png b/docs/assets/image/zh/plugin/install_from_local.png deleted file mode 100644 index 60eb7bfc46e450371bb2d60973a46f0326710df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23498 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
    h3g1&mC3sT_558!Uf08x#=Y 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 YB#1}>GJ*#O4ku$UGqErx8M;OP3k7dT6951J diff --git a/docs/assets/image/zh/plugin/install_method.png b/docs/assets/image/zh/plugin/install_method.png new file mode 100644 index 0000000000000000000000000000000000000000..efef185b1cb606d1b342c59e58f946ac457e0614 GIT binary patch literal 6292 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 Cu|tUf literal 0 HcmV?d00001 diff --git a/docs/assets/image/zh/plugin/pipeline_extensions.png b/docs/assets/image/zh/plugin/pipeline_extensions.png new file mode 100644 index 0000000000000000000000000000000000000000..0445d44e3e3efd4f69e5b66ee4434c8d4a622ec1 GIT binary patch literal 43198 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�e(2nxg$&8 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 literal 0 HcmV?d00001 diff --git a/docs/assets/service-api-openapi-en.json b/docs/assets/service-api-openapi-en.json new file mode 100644 index 000000000..1e81adee2 --- /dev/null +++ b/docs/assets/service-api-openapi-en.json @@ -0,0 +1,1944 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "LangBot API with API Key Authentication", + "description": "LangBot external service API documentation. These endpoints support API Key authentication \nfor external systems to programmatically access LangBot resources.\n\n**Authentication Methods:**\n- User Token (via `Authorization: Bearer `)\n- API Key (via `X-API-Key: ` or `Authorization: Bearer `)\n\nAll endpoints documented here accept BOTH authentication methods.\n", + "version": "4.4.1", + "contact": { + "name": "LangBot", + "url": "https://langbot.app" + }, + "license": { + "name": "AGPL-3.0", + "url": "https://github.com/langbot-app/LangBot/blob/master/LICENSE" + } + }, + "servers": [ + { + "url": "http://localhost:5300", + "description": "Local development server" + } + ], + "tags": [ + { + "name": "Models - LLM", + "description": "Large Language Model management operations" + }, + { + "name": "Models - Embedding", + "description": "Embedding model management operations" + }, + { + "name": "Bots", + "description": "Bot instance management operations" + }, + { + "name": "Pipelines", + "description": "Pipeline configuration management operations" + } + ], + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "paths": { + "/api/v1/provider/models/llm": { + "get": { + "tags": [ + "Models - LLM" + ], + "summary": "List all LLM models", + "description": "Retrieve a list of all configured LLM models", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "models": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LLMModel" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "Models - LLM" + ], + "summary": "Create a new LLM model", + "description": "Create and configure a new LLM model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LLMModelCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Model created successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid", + "example": "550e8400-e29b-41d4-a716-446655440000" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/api/v1/provider/models/llm/{model_uuid}": { + "get": { + "tags": [ + "Models - LLM" + ], + "summary": "Get a specific LLM model", + "description": "Retrieve details of a specific LLM model by UUID", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "model": { + "$ref": "#/components/schemas/LLMModel" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "Models - LLM" + ], + "summary": "Update an LLM model", + "description": "Update the configuration of an existing LLM model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LLMModelUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Model updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "Models - LLM" + ], + "summary": "Delete an LLM model", + "description": "Remove an LLM model from the system", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "Model deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/provider/models/llm/{model_uuid}/test": { + "post": { + "tags": [ + "Models - LLM" + ], + "summary": "Test an LLM model", + "description": "Test the connectivity and functionality of an LLM model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Model configuration to test" + } + } + } + }, + "responses": { + "200": { + "description": "Model test successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/api/v1/provider/models/embedding": { + "get": { + "tags": [ + "Models - Embedding" + ], + "summary": "List all embedding models", + "description": "Retrieve a list of all configured embedding models", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "models": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EmbeddingModel" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "Models - Embedding" + ], + "summary": "Create a new embedding model", + "description": "Create and configure a new embedding model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbeddingModelCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Model created successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/provider/models/embedding/{model_uuid}": { + "get": { + "tags": [ + "Models - Embedding" + ], + "summary": "Get a specific embedding model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "model": { + "$ref": "#/components/schemas/EmbeddingModel" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "Models - Embedding" + ], + "summary": "Update an embedding model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbeddingModelUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Model updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "Models - Embedding" + ], + "summary": "Delete an embedding model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "Model deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/provider/models/embedding/{model_uuid}/test": { + "post": { + "tags": [ + "Models - Embedding" + ], + "summary": "Test an embedding model", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Model test successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/platform/bots": { + "get": { + "tags": [ + "Bots" + ], + "summary": "List all bots", + "description": "Retrieve a list of all configured bot instances", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "bots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Bot" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "Bots" + ], + "summary": "Create a new bot", + "description": "Create and configure a new bot instance", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BotCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Bot created successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/platform/bots/{bot_uuid}": { + "get": { + "tags": [ + "Bots" + ], + "summary": "Get a specific bot", + "description": "Retrieve details of a specific bot instance", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Bot UUID" + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "bot": { + "$ref": "#/components/schemas/Bot" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "Bots" + ], + "summary": "Update a bot", + "description": "Update the configuration of an existing bot instance", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BotUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Bot updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "Bots" + ], + "summary": "Delete a bot", + "description": "Remove a bot instance from the system", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Bot deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/platform/bots/{bot_uuid}/logs": { + "post": { + "tags": [ + "Bots" + ], + "summary": "Get bot event logs", + "description": "Retrieve event logs for a specific bot", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "from_index": { + "type": "integer", + "default": -1, + "description": "Starting index for logs (-1 for latest)" + }, + "max_count": { + "type": "integer", + "default": 10, + "description": "Maximum number of logs to retrieve" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "logs": { + "type": "array", + "items": { + "type": "object" + } + }, + "total_count": { + "type": "integer" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/pipelines": { + "get": { + "tags": [ + "Pipelines" + ], + "summary": "List all pipelines", + "description": "Retrieve a list of all configured pipelines", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "sort_by", + "in": "query", + "schema": { + "type": "string", + "default": "created_at" + }, + "description": "Field to sort by" + }, + { + "name": "sort_order", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ], + "default": "DESC" + }, + "description": "Sort order" + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "pipelines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pipeline" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "Pipelines" + ], + "summary": "Create a new pipeline", + "description": "Create and configure a new pipeline", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PipelineCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Pipeline created successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/pipelines/_/metadata": { + "get": { + "tags": [ + "Pipelines" + ], + "summary": "Get pipeline metadata", + "description": "Retrieve metadata and configuration options for pipelines", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "configs": { + "type": "object" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/pipelines/{pipeline_uuid}": { + "get": { + "tags": [ + "Pipelines" + ], + "summary": "Get a specific pipeline", + "description": "Retrieve details of a specific pipeline", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "pipeline": { + "$ref": "#/components/schemas/Pipeline" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "Pipelines" + ], + "summary": "Update a pipeline", + "description": "Update the configuration of an existing pipeline", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PipelineUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Pipeline updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "Pipelines" + ], + "summary": "Delete a pipeline", + "description": "Remove a pipeline from the system", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Pipeline deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/pipelines/{pipeline_uuid}/extensions": { + "get": { + "tags": [ + "Pipelines" + ], + "summary": "Get pipeline extensions", + "description": "Retrieve extensions and plugins configured for a pipeline", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object" + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "Pipelines" + ], + "summary": "Update pipeline extensions", + "description": "Update the extensions configuration for a pipeline", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Extensions updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + } + }, + "components": { + "securitySchemes": { + "ApiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "X-API-Key", + "description": "API Key authentication using X-API-Key header.\nExample: `X-API-Key: lbk_your_api_key_here`\n" + }, + "BearerAuth": { + "type": "http", + "scheme": "bearer", + "description": "Bearer token authentication. Can be either a user JWT token or an API key.\nExample: `Authorization: Bearer `\n" + } + }, + "parameters": { + "ModelUUID": { + "name": "model_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Model UUID" + } + }, + "schemas": { + "LLMModel": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string", + "example": "GPT-4" + }, + "description": { + "type": "string", + "example": "OpenAI GPT-4 model" + }, + "requester": { + "type": "string", + "example": "openai-chat-completions" + }, + "requester_config": { + "type": "object", + "properties": { + "model": { + "type": "string", + "example": "gpt-4" + }, + "args": { + "type": "object" + } + } + }, + "api_keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "keys": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "chat", + "vision" + ] + }, + "extra_args": { + "type": "object" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "LLMModelCreate": { + "type": "object", + "required": [ + "name", + "requester", + "requester_config", + "api_keys" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "LLMModelUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "EmbeddingModel": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "extra_args": { + "type": "object" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "EmbeddingModelCreate": { + "type": "object", + "required": [ + "name", + "requester", + "requester_config", + "api_keys" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "EmbeddingModelUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "Bot": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "adapter": { + "type": "string", + "example": "telegram" + }, + "config": { + "type": "object" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "BotCreate": { + "type": "object", + "required": [ + "name", + "adapter", + "config" + ], + "properties": { + "name": { + "type": "string" + }, + "adapter": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "BotUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "Pipeline": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "config": { + "type": "object" + }, + "is_default": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "PipelineCreate": { + "type": "object", + "required": [ + "name", + "config" + ], + "properties": { + "name": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "PipelineUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "SuccessResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "nullable": true + } + } + }, + "ErrorResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": -1 + }, + "msg": { + "type": "string", + "example": "Error message" + } + } + } + }, + "responses": { + "UnauthorizedError": { + "description": "Authentication required or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "no_auth": { + "value": { + "code": -1, + "msg": "No valid authentication provided (user token or API key required)" + } + }, + "invalid_key": { + "value": { + "code": -1, + "msg": "Invalid API key" + } + } + } + } + } + }, + "NotFoundError": { + "description": "Resource not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "code": -1, + "msg": "Resource not found" + } + } + } + }, + "InternalServerError": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "code": -2, + "msg": "Internal server error" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/assets/service-api-openapi-zh.json b/docs/assets/service-api-openapi-zh.json new file mode 100644 index 000000000..28dfb2508 --- /dev/null +++ b/docs/assets/service-api-openapi-zh.json @@ -0,0 +1,1944 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "LangBot API 与 API 密钥认证", + "description": "LangBot 外部服务 API 文档。这些接口支持 API 密钥认证,\n供外部系统以编程方式访问 LangBot 资源。\n\n**认证方式:**\n- 用户令牌(通过 `Authorization: Bearer `)\n- API 密钥(通过 `X-API-Key: ` 或 `Authorization: Bearer `)\n\n本文档中的所有接口都同时支持这两种认证方式。\n", + "version": "4.4.1", + "contact": { + "name": "LangBot", + "url": "https://langbot.app" + }, + "license": { + "name": "AGPL-3.0", + "url": "https://github.com/langbot-app/LangBot/blob/master/LICENSE" + } + }, + "servers": [ + { + "url": "http://localhost:5300", + "description": "本地开发服务器" + } + ], + "tags": [ + { + "name": "模型 - 大语言模型", + "description": "大语言模型管理操作" + }, + { + "name": "模型 - 向量模型", + "description": "向量模型管理操作" + }, + { + "name": "机器人", + "description": "机器人实例管理操作" + }, + { + "name": "流水线", + "description": "流水线配置管理操作" + } + ], + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "paths": { + "/api/v1/provider/models/llm": { + "get": { + "tags": [ + "模型 - 大语言模型" + ], + "summary": "列出所有大语言模型", + "description": "获取所有已配置的大语言模型列表", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "models": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LLMModel" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "模型 - 大语言模型" + ], + "summary": "创建新的大语言模型", + "description": "创建并配置一个新的大语言模型", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LLMModelCreate" + } + } + } + }, + "responses": { + "200": { + "description": "模型创建成功", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid", + "example": "550e8400-e29b-41d4-a716-446655440000" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/api/v1/provider/models/llm/{model_uuid}": { + "get": { + "tags": [ + "模型 - 大语言模型" + ], + "summary": "获取指定的大语言模型", + "description": "通过 UUID 获取指定大语言模型的详细信息", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "model": { + "$ref": "#/components/schemas/LLMModel" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "模型 - 大语言模型" + ], + "summary": "更新大语言模型", + "description": "更新现有大语言模型的配置", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LLMModelUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "模型更新成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "模型 - 大语言模型" + ], + "summary": "删除大语言模型", + "description": "从系统中删除一个大语言模型", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "模型删除成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/provider/models/llm/{model_uuid}/test": { + "post": { + "tags": [ + "模型 - 大语言模型" + ], + "summary": "测试大语言模型", + "description": "测试大语言模型的连接性和功能", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "要测试的模型配置" + } + } + } + }, + "responses": { + "200": { + "description": "模型测试成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/api/v1/provider/models/embedding": { + "get": { + "tags": [ + "模型 - 向量模型" + ], + "summary": "列出所有向量模型", + "description": "获取所有已配置的向量模型列表", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "models": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EmbeddingModel" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "模型 - 向量模型" + ], + "summary": "创建新的向量模型", + "description": "创建并配置一个新的向量模型", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbeddingModelCreate" + } + } + } + }, + "responses": { + "200": { + "description": "模型创建成功", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/provider/models/embedding/{model_uuid}": { + "get": { + "tags": [ + "模型 - 向量模型" + ], + "summary": "获取指定的向量模型", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "model": { + "$ref": "#/components/schemas/EmbeddingModel" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "模型 - 向量模型" + ], + "summary": "更新向量模型", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbeddingModelUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "模型更新成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "模型 - 向量模型" + ], + "summary": "删除向量模型", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "responses": { + "200": { + "description": "模型删除成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/provider/models/embedding/{model_uuid}/test": { + "post": { + "tags": [ + "模型 - 向量模型" + ], + "summary": "测试向量模型", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ModelUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "模型测试成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/platform/bots": { + "get": { + "tags": [ + "机器人" + ], + "summary": "列出所有机器人", + "description": "获取所有已配置的机器人实例列表", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "bots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Bot" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "机器人" + ], + "summary": "创建新的机器人", + "description": "创建并配置一个新的机器人实例", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BotCreate" + } + } + } + }, + "responses": { + "200": { + "description": "机器人创建成功", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/platform/bots/{bot_uuid}": { + "get": { + "tags": [ + "机器人" + ], + "summary": "获取指定的机器人", + "description": "获取指定机器人实例的详细信息", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "机器人 UUID" + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "bot": { + "$ref": "#/components/schemas/Bot" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "机器人" + ], + "summary": "更新机器人", + "description": "更新现有机器人实例的配置", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BotUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "机器人更新成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "机器人" + ], + "summary": "删除机器人", + "description": "从系统中删除一个机器人实例", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "机器人删除成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/platform/bots/{bot_uuid}/logs": { + "post": { + "tags": [ + "机器人" + ], + "summary": "获取机器人事件日志", + "description": "获取指定机器人的事件日志", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "bot_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "from_index": { + "type": "integer", + "default": -1, + "description": "日志起始索引(-1 表示最新)" + }, + "max_count": { + "type": "integer", + "default": 10, + "description": "要获取的最大日志数量" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "logs": { + "type": "array", + "items": { + "type": "object" + } + }, + "total_count": { + "type": "integer" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/pipelines": { + "get": { + "tags": [ + "流水线" + ], + "summary": "列出所有流水线", + "description": "获取所有已配置的流水线列表", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "sort_by", + "in": "query", + "schema": { + "type": "string", + "default": "created_at" + }, + "description": "排序字段" + }, + { + "name": "sort_order", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ], + "default": "DESC" + }, + "description": "排序顺序" + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "pipelines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pipeline" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + }, + "post": { + "tags": [ + "流水线" + ], + "summary": "创建新的流水线", + "description": "创建并配置一个新的流水线", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PipelineCreate" + } + } + } + }, + "responses": { + "200": { + "description": "流水线创建成功", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/pipelines/_/metadata": { + "get": { + "tags": [ + "流水线" + ], + "summary": "获取流水线元数据", + "description": "获取流水线的元数据和配置选项", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "configs": { + "type": "object" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + } + } + } + }, + "/api/v1/pipelines/{pipeline_uuid}": { + "get": { + "tags": [ + "流水线" + ], + "summary": "获取指定的流水线", + "description": "获取指定流水线的详细信息", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "pipeline": { + "$ref": "#/components/schemas/Pipeline" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "流水线" + ], + "summary": "更新流水线", + "description": "更新现有流水线的配置", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PipelineUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "流水线更新成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "delete": { + "tags": [ + "流水线" + ], + "summary": "删除流水线", + "description": "从系统中删除一个流水线", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "流水线删除成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + }, + "/api/v1/pipelines/{pipeline_uuid}/extensions": { + "get": { + "tags": [ + "流水线" + ], + "summary": "获取流水线扩展", + "description": "获取流水线配置的扩展和插件", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "成功响应", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object" + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + }, + "put": { + "tags": [ + "流水线" + ], + "summary": "更新流水线扩展", + "description": "更新流水线的扩展配置", + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "pipeline_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "扩展更新成功", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/UnauthorizedError" + }, + "404": { + "$ref": "#/components/responses/NotFoundError" + } + } + } + } + }, + "components": { + "securitySchemes": { + "ApiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "X-API-Key", + "description": "使用 X-API-Key 请求头进行 API 密钥认证。\n示例:`X-API-Key: lbk_your_api_key_here`\n" + }, + "BearerAuth": { + "type": "http", + "scheme": "bearer", + "description": "Bearer 令牌认证。可以是用户 JWT 令牌或 API 密钥。\n示例:`Authorization: Bearer `\n" + } + }, + "parameters": { + "ModelUUID": { + "name": "model_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "模型 UUID" + } + }, + "schemas": { + "LLMModel": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string", + "example": "GPT-4" + }, + "description": { + "type": "string", + "example": "OpenAI GPT-4 model" + }, + "requester": { + "type": "string", + "example": "openai-chat-completions" + }, + "requester_config": { + "type": "object", + "properties": { + "model": { + "type": "string", + "example": "gpt-4" + }, + "args": { + "type": "object" + } + } + }, + "api_keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "keys": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "chat", + "vision" + ] + }, + "extra_args": { + "type": "object" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "LLMModelCreate": { + "type": "object", + "required": [ + "name", + "requester", + "requester_config", + "api_keys" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "LLMModelUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "EmbeddingModel": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "extra_args": { + "type": "object" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "EmbeddingModelCreate": { + "type": "object", + "required": [ + "name", + "requester", + "requester_config", + "api_keys" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "EmbeddingModelUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requester_config": { + "type": "object" + }, + "api_keys": { + "type": "array", + "items": { + "type": "object" + } + }, + "extra_args": { + "type": "object" + } + } + }, + "Bot": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "adapter": { + "type": "string", + "example": "telegram" + }, + "config": { + "type": "object" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "BotCreate": { + "type": "object", + "required": [ + "name", + "adapter", + "config" + ], + "properties": { + "name": { + "type": "string" + }, + "adapter": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "BotUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "Pipeline": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "config": { + "type": "object" + }, + "is_default": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "PipelineCreate": { + "type": "object", + "required": [ + "name", + "config" + ], + "properties": { + "name": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "PipelineUpdate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "config": { + "type": "object" + } + } + }, + "SuccessResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "msg": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "nullable": true + } + } + }, + "ErrorResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": -1 + }, + "msg": { + "type": "string", + "example": "错误消息" + } + } + } + }, + "responses": { + "UnauthorizedError": { + "description": "需要认证或凭据无效", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "examples": { + "no_auth": { + "value": { + "code": -1, + "msg": "未提供有效认证(需要用户令牌或 API 密钥)" + } + }, + "invalid_key": { + "value": { + "code": -1, + "msg": "无效的 API 密钥" + } + } + } + } + } + }, + "NotFoundError": { + "description": "资源未找到", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "code": -1, + "msg": "资源未找到" + } + } + } + }, + "InternalServerError": { + "description": "内部服务器错误", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "code": -2, + "msg": "内部服务器错误" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/en/deploy/langbot/manual.md b/docs/en/deploy/langbot/manual.md index 38f96d790..483e5ab7e 100644 --- a/docs/en/deploy/langbot/manual.md +++ b/docs/en/deploy/langbot/manual.md @@ -3,7 +3,6 @@ :::warning 1. Please use Python 3.10.1 (not including 3.10.0) or higher version, 3.10.14 is recommended. You need to install Python if you don't have it. 2. This method is not recommended, manual deployment may not be supported in the future. Please consider using Docker deployment. -3. **Do not deploy LangBot natively on Windows, [this will make plugins unusable](/en/plugin/compatibility)**, please use [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) or Docker deployment. ::: ## Installing the Main Program @@ -12,30 +11,9 @@ ![Download Release](/assets/image/zh/deploy/langbot/manual/dl_release.png) -:::info - -You can also use the following commands to clone the latest code (may contain unstable code) and use it: - -```bash -# Clone the main repository -git clone https://github.com/langbot-app/LangBot -cd LangBot -``` - -Then manually build the frontend: - -```bash -# Build frontend, requires NodeJS >= 22 -cd web -npm install && npm run build -cd .. -``` - -::: - 2. Install dependencies -We use uv to manage dependencies. +We use [uv](https://docs.astral.sh/uv/) to manage dependencies. ```bash pip install uv @@ -61,7 +39,7 @@ You will see the following message: 📖Documentation: https://docs.langbot.app The following files do not exist and have been automatically generated. Please modify the configuration files as needed and restart: -- plugins/__init__.py +- data/config.yaml ... ``` diff --git a/docs/en/plugin/compatibility.md b/docs/en/plugin/compatibility.md index c4a7b0114..be7bde856 100644 --- a/docs/en/plugin/compatibility.md +++ b/docs/en/plugin/compatibility.md @@ -8,8 +8,8 @@ If we switch to using `SelectorEventLoop`, it would prevent Plugin Runtime and p For detailed information about these issues, please refer to: [Python Official Documentation](https://docs.python.org/3.13/library/asyncio-platforms.html) -## Proposed Solution +## Solution -In the future, we plan to support WebSocket as the default communication method between LangBot and Plugin Runtime, as well as between Plugin Runtime and plugins on Windows. +Unlike the tight coupling between subprocess management and Stdio communication on Unix-like systems, LangBot and the Plugin Runtime automatically switch to a hybrid subprocess + WebSocket communication strategy on Windows. LangBot still launches the Plugin Runtime via a subprocess, but communicates with it over WebSocket; similarly, the Plugin Runtime starts each installed plugin via subprocesses while communicating with them through WebSocket. -For now, please deploy LangBot on Unix-like systems, or use Docker or WSL2 on Windows. \ No newline at end of file +This behavior is automatically selected based on the OS, so no manual configuration is required. \ No newline at end of file diff --git a/docs/en/plugin/plugin-intro.md b/docs/en/plugin/plugin-intro.md index f5527e0b4..e2a782c6c 100644 --- a/docs/en/plugin/plugin-intro.md +++ b/docs/en/plugin/plugin-intro.md @@ -6,13 +6,9 @@ Each plugin runs in an independent process, managed uniformly by the Plugin Runt -:::warning -Due to Python Asyncio compatibility issues, the plugin system currently cannot run properly in native Windows environments. Please use Docker or WSL2 for deployment: [System Compatibility](/en/plugin/compatibility) -::: - ## Plugin Structure -Plugins can consist of the following components based on their specific functionality: +Plugins can provide the following components based on their specific functionality: - Event Handlers: Listen to events during pipeline execution and modify context or pipelines. - Commands: Triggered by user command messages starting with `!` (or other configured prefixes). @@ -25,14 +21,18 @@ More component types will be supported for plugin implementation in the future. Currently supports uploading plugin packages and installing plugins from the plugin marketplace. In LangBot's plugin management page, click the top-right corner to choose the installation method. - + -Select `.lbpkg` files shared by others or downloaded from the Marketplace to install plugins. +Click `Upload Local`, select `.lbpkg` files shared by others or downloaded from the Marketplace to install plugins. Or click the Plugin Marketplace tab, select a plugin, and click install. +After installing plugins, you need to select the plugin in your pipeline configuration page. + + + ## Plugin Management ### Plugin Configuration diff --git a/docs/en/tags/[operationId].md b/docs/en/tags/[operationId].md new file mode 100644 index 000000000..587c310a1 --- /dev/null +++ b/docs/en/tags/[operationId].md @@ -0,0 +1,13 @@ +--- +aside: false +outline: [2, 3] +title: Service API +--- + + + + diff --git a/docs/en/tags/[operationId].paths.mts b/docs/en/tags/[operationId].paths.mts new file mode 100644 index 000000000..1fa0b9cfd --- /dev/null +++ b/docs/en/tags/[operationId].paths.mts @@ -0,0 +1,18 @@ +import { usePaths } from 'vitepress-openapi' +import spec from '../../assets/service-api-openapi-en.json' with { type: 'json' } + +export default { + paths() { + return usePaths({ spec }) + .getPathsByVerbs() + .filter(item => item && item.operationId) + .map(({ operationId, summary }) => { + return { + params: { + operationId, + pageTitle: `${summary || operationId} - LangBot API`, + }, + } + }) + }, +} diff --git a/docs/en/tags/[tag].md b/docs/en/tags/[tag].md new file mode 100644 index 000000000..c2902a5aa --- /dev/null +++ b/docs/en/tags/[tag].md @@ -0,0 +1,16 @@ +--- +aside: false +outline: false +title: Service API +--- + + + + diff --git a/docs/en/tags/[tag].paths.mts b/docs/en/tags/[tag].paths.mts new file mode 100644 index 000000000..7932baa1b --- /dev/null +++ b/docs/en/tags/[tag].paths.mts @@ -0,0 +1,17 @@ +import { usePaths } from 'vitepress-openapi' +import spec from '../../assets/service-api-openapi-en.json' with { type: 'json' } + +export default { + paths() { + return usePaths({ spec }) + .getTags() + .map(({ name }) => { + return { + params: { + tag: name, + pageTitle: `${name} - LangBot API`, + }, + } + }) + }, +} diff --git a/docs/en/tags/readme.md b/docs/en/tags/readme.md new file mode 100644 index 000000000..1d16d8d5c --- /dev/null +++ b/docs/en/tags/readme.md @@ -0,0 +1,21 @@ +# Service API Overview + +LangBot provides a set of APIs for external services to integrate. These APIs are authenticated with API keys, which are a subset of the HTTP API. To view the API documentation for frontend-backend communication, please go to the [Development](/en/develop/dev-config) section. + +::: warning +Service API is currently in Beta and some APIs may change frequently. +::: + +## Get API Key + +Click the `API Keys` button in the sidebar of the WebUI to create an API Key. + +![create_api_key](/assets/image/zh/api/create_api_key.png) + +After creation, copy the API Key and save it. + +![copy_api_key](/assets/image/zh/api/copy_api_key.png) + +## Use API + +The left sidebar lists all available APIs. You can fill in your instance address (the port address exposed by the backend, default is `http://localhost:5300`) and API Key, then click the `Try it out` button to call the API. diff --git a/docs/zh/deploy/langbot/manual.md b/docs/zh/deploy/langbot/manual.md index c635bef4a..0d3c83435 100644 --- a/docs/zh/deploy/langbot/manual.md +++ b/docs/zh/deploy/langbot/manual.md @@ -2,8 +2,7 @@ :::warning 1. 请使用Python 3.10.1(不包含3.10.0)及以上版本,推荐3.10.14版本,没有Python的需自行安装。 -2. 不推荐此方式,后续可能不再支持手动部署,请考虑使用 Docker 部署。 -3. **请勿在 Windows 系统上原生部署 LangBot,[这将导致插件不可用](/zh/plugin/compatibility)**,推荐使用 [WSL2](https://learn.microsoft.com/zh-cn/windows/wsl/install) 或 Docker 部署。 +2. Unix-like 系统上请优先考虑使用 Docker 部署。 ::: ## 安装主程序 @@ -12,37 +11,9 @@ ![下载Release](/assets/image/zh/deploy/langbot/manual/dl_release.png) -:::info - -您也可以使用以下命令克隆最新代码(有可能包含不稳定的代码)并使用: - -```bash -# 克隆主仓库 -git clone https://github.com/langbot-app/LangBot -cd LangBot -``` - -若您位于中国大陆境内,可以从 [GitCode 镜像](https://gitcode.com/RockChinQ/LangBot) 克隆: - -```bash -git clone https://gitcode.com/RockChinQ/LangBot -cd LangBot -``` - -接下来手动构建前端: - -```bash -# 构建前端,需要 NodeJS >= 22 -cd web -npm install && npm run build -cd .. -``` - -::: - 2. 安装依赖 -我们使用 uv 管理依赖。 +我们使用 [uv](https://docs.astral.sh/uv/) 管理依赖。 ```bash pip install uv @@ -75,13 +46,8 @@ uv run main.py 📖文档地址: https://docs.langbot.app 以下文件不存在,已自动生成,请按需修改配置文件后重启: -- plugins/__init__.py +- data/config.yaml ... ``` 接下来可以使用 Ctrl+C 退出程序,继续查看[部署机器人](/zh/deploy/platforms/readme)页。 - -:::info -LangBot 在每次启动时会检查所有插件的依赖以便确保所有插件都能正常运行。 -如果由于网络问题导致 LangBot 无法正常检查依赖,可以提供`--skip-plugin-deps-check`参数跳过检查,并自行安装插件依赖:命令行切换目录到`plugins`目录下的每个子文件夹(若已安装插件),然后使用`uv sync`安装依赖。 -::: \ No newline at end of file diff --git a/docs/zh/plugin/compatibility.md b/docs/zh/plugin/compatibility.md index 602c61423..ea9bd8c79 100644 --- a/docs/zh/plugin/compatibility.md +++ b/docs/zh/plugin/compatibility.md @@ -1,4 +1,4 @@ -# 系统兼容性 +# 系统兼容处理 LangBot 插件系统运用了`Asyncio`和`Subprocess`等机制,这在unix-like系统(如Linux、MacOS)上运行良好,但在Windows上存在一些问题,导致插件无法正常运行。 @@ -8,8 +8,8 @@ Windows 上的 Python 异步事件循环默认使用 `ProactorEventLoop`,但 详细问题参阅:[Python官方文档](https://docs.python.org/zh-cn/3.13/library/asyncio-platforms.html) -## 解决方案(拟) +## 解决方案 -后续将支持在 Windows 上默认采用 Websocket 作为 LangBot 到 Plugin Runtime 、Plugin Runtime 到插件的通信方式。 +与 Unix-like 系统上的子进程管理与 Stdio 通信绑定的形式不同,LangBot 和 Plugin Runtime 在 Windows 上会自动采用 子进程 + WebSocket 结合的跨进程通信技术,LangBot 通过子进程启动 Plugin Runtime 但通过 WebSocket 与其通信;Plugin Runtime 也通过子进程启动各个已安装插件但通过 WebSocket 通信。 -现阶段请您使用 Unix-like 系统部署 LangBot,或在 Windows 上使用 Docker 或 WSL2。 \ No newline at end of file +这是 LangBot 根据系统标识自动适应的,您无需手动配置。 \ No newline at end of file diff --git a/docs/zh/plugin/plugin-intro.md b/docs/zh/plugin/plugin-intro.md index 5f5590c94..f4f8de7e8 100644 --- a/docs/zh/plugin/plugin-intro.md +++ b/docs/zh/plugin/plugin-intro.md @@ -6,13 +6,9 @@ LangBot 内部由多种组件组成,如大模型工具、命令、消息平台 -:::warning -由于 Python Asyncio 的兼容性问题,目前无法正常在 Windows 原生环境中使用插件系统,请改为使用 Docker 或 WSL2部署:[系统兼容性](/zh/plugin/compatibility) -::: - ## 插件结构 -插件根据具体功能可由以下组件构成: +插件根据具体功能可提供以下组件: - 事件处理器:监听流水线执行期间的事件,对上下文或流水线进行修改。 - 命令:由用户通过`!`(或其他已设置的前缀)开头的命令消息触发。 @@ -22,17 +18,21 @@ LangBot 内部由多种组件组成,如大模型工具、命令、消息平台 ## 安装插件 -目前支持上传插件包和从插件市场安装插件。 +目前支持上传插件包安装、从插件市场安装以及从 GitHub Release 安装插件。 在 LangBot 的插件管理页面,点击右上角即可选择安装方式 - + -选择他人分享的或从 Marketplace 下载的`.lbpkg`文件,即可安装插件。 +点击本地安装,选择他人分享的或从 Marketplace 下载的`.lbpkg`文件,即可安装插件。 或点击插件市场 Tab,选择插件后点击安装。 +安装插件后,您需要到流水线配置中,选择所需要使用的插件。 + + + ## 插件管理 ### 插件配置项 diff --git a/docs/zh/tags/[operationId].md b/docs/zh/tags/[operationId].md new file mode 100644 index 000000000..587c310a1 --- /dev/null +++ b/docs/zh/tags/[operationId].md @@ -0,0 +1,13 @@ +--- +aside: false +outline: [2, 3] +title: Service API +--- + + + + diff --git a/docs/zh/tags/[operationId].paths.mts b/docs/zh/tags/[operationId].paths.mts new file mode 100644 index 000000000..580371b2e --- /dev/null +++ b/docs/zh/tags/[operationId].paths.mts @@ -0,0 +1,18 @@ +import { usePaths } from 'vitepress-openapi' +import spec from '../../assets/service-api-openapi-zh.json' with { type: 'json' } + +export default { + paths() { + return usePaths({ spec }) + .getPathsByVerbs() + .filter(item => item && item.operationId) + .map(({ operationId, summary }) => { + return { + params: { + operationId, + pageTitle: `${summary || operationId} - LangBot API`, + }, + } + }) + }, +} diff --git a/docs/zh/tags/[tag].md b/docs/zh/tags/[tag].md new file mode 100644 index 000000000..8aac25cfe --- /dev/null +++ b/docs/zh/tags/[tag].md @@ -0,0 +1,16 @@ +--- +aside: false +outline: false +title: Service API +--- + + + + \ No newline at end of file diff --git a/docs/zh/tags/[tag].paths.mts b/docs/zh/tags/[tag].paths.mts new file mode 100644 index 000000000..ec4ab08cf --- /dev/null +++ b/docs/zh/tags/[tag].paths.mts @@ -0,0 +1,18 @@ +import { usePaths } from 'vitepress-openapi' +import spec from '../../assets/service-api-openapi-zh.json' with { type: 'json' } + +export default { + paths() { + return usePaths({ spec }) + .getTags() + .map(({ name }) => { + return { + params: { + tag: name, + pageTitle: `${name} - LangBot API`, + }, + } + }) + }, +} + diff --git a/docs/zh/tags/readme.md b/docs/zh/tags/readme.md new file mode 100644 index 000000000..4a471f90b --- /dev/null +++ b/docs/zh/tags/readme.md @@ -0,0 +1,21 @@ +# Service API 概述 + +LangBot 提供了一套供外部服务使用的 API 接口,便于集成。这些接口以 API Key 鉴权,是目前 HTTP API 的子集。要查看前后端通信的 API 文档,请前往[开发](/zh/develop/dev-config)部分。 + +::: warning +Service API 目前处于 Beta 阶段,部分接口可能会频繁变动。 +::: + +## 获取 API Key + +点击 WebUI 侧栏的`API Keys`按钮,创建一个 API Key。 + +![create_api_key](/assets/image/zh/api/create_api_key.png) + +创建后,复制 API Key 并保存。 + +![copy_api_key](/assets/image/zh/api/copy_api_key.png) + +## 使用 API + +左侧列出了所有可用的 API,您可以填入您的实例地址(后端开放的端口地址,默认为 `http://localhost:5300`)和 API Key,然后点击`Try it out`按钮即可调用 API。 \ No newline at end of file diff --git a/package.json b/package.json index 2fe634de7..7a469afd1 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "docs:preview": "vitepress preview docs" }, "dependencies": { - "mermaid": "^11.8.0" + "mermaid": "^11.8.0", + "vitepress-openapi": "^0.1.10" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6aeabba99..70b804dc0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: mermaid: specifier: ^11.8.0 version: 11.12.1 + vitepress-openapi: + specifier: ^0.1.10 + version: 0.1.10(vitepress@1.6.4(@algolia/client-search@5.42.0)(postcss@8.5.6)(search-insights@2.17.3))(vue@3.5.22) devDependencies: vitepress: specifier: ^1.3.4 @@ -296,6 +299,18 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@floating-ui/vue@1.1.9': + resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} + '@iconify-json/simple-icons@1.2.57': resolution: {integrity: sha512-/yWbO502M6WfvmcV5OjEgA4uoPN/76nrn7Hri/8g9L4GiNQ6VMgXWE9vFp4tDsmGMAe4ZCov3NbH6vJCgXZ1hA==} @@ -305,6 +320,12 @@ packages: '@iconify/utils@3.0.2': resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + '@internationalized/date@3.10.0': + resolution: {integrity: sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==} + + '@internationalized/number@3.6.5': + resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -445,6 +466,17 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + + '@tanstack/vue-virtual@3.13.12': + resolution: {integrity: sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -619,6 +651,11 @@ packages: '@vueuse/core@12.8.2': resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + '@vueuse/core@13.9.0': + resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} + peerDependencies: + vue: ^3.5.0 + '@vueuse/integrations@12.8.2': resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} peerDependencies: @@ -663,9 +700,17 @@ packages: '@vueuse/metadata@12.8.2': resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + '@vueuse/metadata@13.9.0': + resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} + '@vueuse/shared@12.8.2': resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + '@vueuse/shared@13.9.0': + resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} + peerDependencies: + vue: ^3.5.0 + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -675,6 +720,10 @@ packages: resolution: {integrity: sha512-X5+PtWc9EJIPafT/cj8ZG+6IU3cjRRnlHGtqMHK/9gsiupQbAyYlH5y7qt/FtsAhfX5AICHffZy69ZAsVrxWkQ==} engines: {node: '>= 14.0.0'} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + birpc@2.7.0: resolution: {integrity: sha512-tub/wFGH49vNCm0xraykcY3TcRgX/3JsALYq/Lwrtti+bTyFHkCUAWF5wgYoie8P41wYwig2mIKiqoocr1EkEQ==} @@ -695,6 +744,13 @@ packages: chevrotain@11.0.3: resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -893,6 +949,9 @@ packages: supports-color: optional: true + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -993,12 +1052,20 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lucide-vue-next@0.503.0: + resolution: {integrity: sha512-3MrtHIBdh4dPCUZDLxQnvmQ17UzUnBYgezUSIo87Laais8hOz6qIPllp0iG/uS/UIzk7bJxyZRzoZTW/gLSr4A==} + peerDependencies: + vue: '>=3.0.1' + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-it-link-attributes@4.0.1: + resolution: {integrity: sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==} + marked@16.4.1: resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==} engines: {node: '>= 20'} @@ -1042,6 +1109,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + oniguruma-to-es@3.1.1: resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} @@ -1094,6 +1164,11 @@ packages: regex@6.0.1: resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + reka-ui@2.6.0: + resolution: {integrity: sha512-NrGMKrABD97l890mFS3TNUzB0BLUfbL3hh0NjcJRIUSUljb288bx3Mzo31nOyUcdiiW0HqFGXJwyCBh9cWgb0w==} + peerDependencies: + vue: '>= 3.2.0' + rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -1155,6 +1230,9 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -1214,6 +1292,12 @@ packages: terser: optional: true + vitepress-openapi@0.1.10: + resolution: {integrity: sha512-Pu7h2EFM0yvrjSgDsoBhWaRKTTl+5Z21lmkjh1aFtZk7f3CXD0pTXrUOh/3juBUmLv+zoS3t4vSGKtll2Cd6mw==} + peerDependencies: + vitepress: '>=1.0.0' + vue: ^3.0.0 + vitepress@1.6.4: resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} hasBin: true @@ -1246,6 +1330,17 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue@3.5.22: resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} peerDependencies: @@ -1503,6 +1598,26 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@floating-ui/vue@1.1.9(vue@3.5.22)': + dependencies: + '@floating-ui/dom': 1.7.4 + '@floating-ui/utils': 0.2.10 + vue-demi: 0.14.10(vue@3.5.22) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@iconify-json/simple-icons@1.2.57': dependencies: '@iconify/types': 2.0.0 @@ -1522,6 +1637,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@internationalized/date@3.10.0': + dependencies: + '@swc/helpers': 0.5.17 + + '@internationalized/number@3.6.5': + dependencies: + '@swc/helpers': 0.5.17 + '@jridgewell/sourcemap-codec@1.5.5': {} '@mermaid-js/parser@0.6.3': @@ -1634,6 +1757,17 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tanstack/virtual-core@3.13.12': {} + + '@tanstack/vue-virtual@3.13.12(vue@3.5.22)': + dependencies: + '@tanstack/virtual-core': 3.13.12 + vue: 3.5.22 + '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -1867,6 +2001,13 @@ snapshots: transitivePeerDependencies: - typescript + '@vueuse/core@13.9.0(vue@3.5.22)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.22) + vue: 3.5.22 + '@vueuse/integrations@12.8.2(focus-trap@7.6.6)': dependencies: '@vueuse/core': 12.8.2 @@ -1879,12 +2020,18 @@ snapshots: '@vueuse/metadata@12.8.2': {} + '@vueuse/metadata@13.9.0': {} + '@vueuse/shared@12.8.2': dependencies: vue: 3.5.22 transitivePeerDependencies: - typescript + '@vueuse/shared@13.9.0(vue@3.5.22)': + dependencies: + vue: 3.5.22 + acorn@8.15.0: {} algoliasearch@5.42.0: @@ -1904,6 +2051,10 @@ snapshots: '@algolia/requester-fetch': 5.42.0 '@algolia/requester-node-http': 5.42.0 + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + birpc@2.7.0: {} ccount@2.0.1: {} @@ -1926,6 +2077,12 @@ snapshots: '@chevrotain/utils': 11.0.3 lodash-es: 4.17.21 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clsx@2.1.1: {} + comma-separated-tokens@2.0.3: {} commander@7.2.0: {} @@ -2140,6 +2297,8 @@ snapshots: dependencies: ms: 2.1.3 + defu@6.1.4: {} + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -2259,12 +2418,18 @@ snapshots: lodash-es@4.17.21: {} + lucide-vue-next@0.503.0(vue@3.5.22): + dependencies: + vue: 3.5.22 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 mark.js@8.11.1: {} + markdown-it-link-attributes@4.0.1: {} + marked@16.4.1: {} mdast-util-to-hast@13.2.0: @@ -2336,6 +2501,8 @@ snapshots: nanoid@3.3.11: {} + ohash@2.0.11: {} + oniguruma-to-es@3.1.1: dependencies: emoji-regex-xs: 1.0.0 @@ -2393,6 +2560,23 @@ snapshots: dependencies: regex-utilities: 2.3.0 + reka-ui@2.6.0(vue@3.5.22): + dependencies: + '@floating-ui/dom': 1.7.4 + '@floating-ui/vue': 1.1.9(vue@3.5.22) + '@internationalized/date': 3.10.0 + '@internationalized/number': 3.6.5 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.22) + '@vueuse/core': 12.8.2 + '@vueuse/shared': 12.8.2 + aria-hidden: 1.2.6 + defu: 6.1.4 + ohash: 2.0.11 + vue: 3.5.22 + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + rfdc@1.4.1: {} robust-predicates@3.0.2: {} @@ -2474,6 +2658,8 @@ snapshots: ts-dedent@2.2.0: {} + tslib@2.8.1: {} + ufo@1.6.1: {} unist-util-is@6.0.1: @@ -2519,6 +2705,20 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + vitepress-openapi@0.1.10(vitepress@1.6.4(@algolia/client-search@5.42.0)(postcss@8.5.6)(search-insights@2.17.3))(vue@3.5.22): + dependencies: + '@vueuse/core': 13.9.0(vue@3.5.22) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + lucide-vue-next: 0.503.0(vue@3.5.22) + markdown-it-link-attributes: 4.0.1 + reka-ui: 2.6.0(vue@3.5.22) + vitepress: 1.6.4(@algolia/client-search@5.42.0)(postcss@8.5.6)(search-insights@2.17.3) + vue: 3.5.22 + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + vitepress@1.6.4(@algolia/client-search@5.42.0)(postcss@8.5.6)(search-insights@2.17.3): dependencies: '@docsearch/css': 3.8.2 @@ -2585,6 +2785,10 @@ snapshots: vscode-uri@3.0.8: {} + vue-demi@0.14.10(vue@3.5.22): + dependencies: + vue: 3.5.22 + vue@3.5.22: dependencies: '@vue/compiler-dom': 3.5.22