diff --git a/backend/go.mod b/backend/go.mod index efec53e91..01a001d9c 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -5,12 +5,14 @@ go 1.25.0 require ( github.com/aws/aws-sdk-go v1.40.45 github.com/gin-gonic/gin v1.12.0 + github.com/google/uuid v1.5.0 github.com/qiniu/go-sdk/v7 v7.27.0 github.com/redis/go-redis/v9 v9.22.0 github.com/tencentyun/cos-go-sdk-v5 v0.7.75 github.com/volcengine/volc-sdk-golang v1.0.253 golang.org/x/crypto v0.54.0 golang.org/x/net v0.57.0 + golang.org/x/sync v0.22.0 gorm.io/driver/postgres v1.6.2 gorm.io/driver/sqlite v1.6.0 gorm.io/gorm v1.31.2 @@ -35,7 +37,6 @@ require ( github.com/goccy/go-yaml v1.19.2 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/uuid v1.5.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.10.0 // indirect @@ -60,7 +61,6 @@ require ( go.mongodb.org/mongo-driver/v2 v2.8.0 // indirect go.uber.org/atomic v1.11.0 // indirect golang.org/x/arch v0.29.0 // indirect - golang.org/x/sync v0.22.0 // indirect golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.40.0 // indirect google.golang.org/protobuf v1.36.11 // indirect diff --git a/backend/internal/protocol/official_catalog_test.go b/backend/internal/protocol/official_catalog_test.go index 7c7ef3b2e..8434b3c35 100644 --- a/backend/internal/protocol/official_catalog_test.go +++ b/backend/internal/protocol/official_catalog_test.go @@ -129,11 +129,11 @@ func TestOfficialAgentProfilesMapToolRequestsAndResponses(t *testing.T) { name, packageName, providerID, marker, wantPath, response, wantID, wantSignature string }{ { - name: "openai-chat", packageName: "openai-chat-completions.yingce-plugin", providerID: "chat-completion", marker: "chat", wantPath: "/v1/chat/completions", wantID: "call-chat", + name: "openai-chat", packageName: "openai-chat-completions.yingce-plugin", providerID: "chat-completion", marker: "chat", wantPath: "/chat/completions", wantID: "call-chat", response: `{"choices":[{"message":{"content":"chat answer","tool_calls":[{"id":"call-chat","function":{"name":"canvas_get_state","arguments":"{\"scope\":\"all\"}"}}]}}]}`, }, { - name: "openai-responses", packageName: "openai-responses.yingce-plugin", providerID: "openai-response", marker: "responses", wantPath: "/v1/responses", wantID: "call-responses", + name: "openai-responses", packageName: "openai-responses.yingce-plugin", providerID: "openai-response", marker: "responses", wantPath: "/responses", wantID: "call-responses", response: `{"output_text":"responses answer","output":[{"type":"message"},{"type":"function_call","call_id":"call-responses","name":"canvas_get_state","arguments":"{\"scope\":\"all\"}"}]}`, }, { diff --git a/backend/internal/service/provider_test.go b/backend/internal/service/provider_test.go index 1da377a84..b7c15412f 100644 --- a/backend/internal/service/provider_test.go +++ b/backend/internal/service/provider_test.go @@ -59,6 +59,8 @@ func TestChannelAPIURLNormalizesConfiguredVersionPrefix(t *testing.T) { {name: "same v1beta is not duplicated", base: "http://provider.test:8000/v1beta", path: "/v1beta/models/model", want: "http://provider.test:8000/v1beta/models/model"}, {name: "path carries v2", base: "http://provider.test:8000/v1", path: "/v2/tasks", want: "http://provider.test:8000/v2/tasks"}, {name: "ark v3", base: "https://ark.example.com/api/v3", path: "/images/generations", want: "https://ark.example.com/api/v3/images/generations"}, + {name: "ark v3 chat", base: "https://ark.example.com/api/v3", path: "/chat/completions", want: "https://ark.example.com/api/v3/chat/completions"}, + {name: "ark v3 responses", base: "https://ark.example.com/api/v3", path: "/responses", want: "https://ark.example.com/api/v3/responses"}, {name: "path carries ark v3", base: "https://ark.example.com", path: "/api/v3/images/generations", want: "https://ark.example.com/api/v3/images/generations"}, {name: "path carries autodl api v1", base: "https://autodl.art", path: "/api/v1/comfyui/comfyui_workflow/workflow-1", want: "https://autodl.art/api/v1/comfyui/comfyui_workflow/workflow-1"}, } diff --git a/plugin-packages/generate-catalog.mjs b/plugin-packages/generate-catalog.mjs index 10cacab48..111a4176e 100644 --- a/plugin-packages/generate-catalog.mjs +++ b/plugin-packages/generate-catalog.mjs @@ -86,7 +86,7 @@ function add(spec) { add({ id: "openai-chat-completions", providerId: "chat-completion", name: "OpenAI Chat Completions", vendor: "OpenAI", capability: "text", baseUrl: "https://api.openai.com", auth: bearer, params: textParams, - create: jsonCreate("/v1/chat/completions", { + create: jsonCreate("/chat/completions", { model: ref("request.model"), messages: ref("request.messages"), temperature: omit(ref("request.providerOptions.chat-completion.temperature")), top_p: omit(ref("request.providerOptions.chat-completion.top_p")), @@ -103,7 +103,7 @@ add({ top_logprobs: omit(ref("request.providerOptions.chat-completion.top_logprobs")), user: omit(ref("request.providerOptions.chat-completion.user")) }), - agent: jsonCreate("/v1/chat/completions", { $merge: [ref("request.extra.agent.chatCompletion"), { model: ref("request.model") }] }), + agent: jsonCreate("/chat/completions", { $merge: [ref("request.extra.agent.chatCompletion"), { model: ref("request.model") }] }), agentResponse: { textPaths: ["choices.0.message.content", "choices.0.text"], reasoningPaths: ["choices.0.message.reasoning_content"], toolCallsPath: "choices.0.message.tool_calls", toolCallIdPaths: ["id"], toolCallNamePaths: ["function.name"], toolCallArgumentsPaths: ["function.arguments"] }, response: { status: "succeeded", textPaths: ["choices.0.message.content", "choices.0.text"], reasoningPaths: ["choices.0.message.reasoning_content"], usage: ref("response.usage"), errorPaths: ["error.code"], messagePaths: ["error.message"] } }); @@ -111,7 +111,7 @@ add({ add({ id: "openai-responses", providerId: "openai-response", name: "OpenAI Responses", vendor: "OpenAI", capability: "text", baseUrl: "https://api.openai.com", auth: bearer, params: textParams, - create: jsonCreate("/v1/responses", { + create: jsonCreate("/responses", { model: ref("request.model"), input: ref("request.messages"), instructions: omit(ref("request.instructions")), temperature: omit(ref("request.providerOptions.openai-response.temperature")), top_p: omit(ref("request.providerOptions.openai-response.top_p")), @@ -123,7 +123,7 @@ add({ stream: omit(ref("request.providerOptions.openai-response.stream")), truncation: omit(ref("request.providerOptions.openai-response.truncation")), user: omit(ref("request.providerOptions.openai-response.user")) }), - agent: jsonCreate("/v1/responses", { $merge: [ref("request.extra.agent.responses"), { model: ref("request.model") }] }), + agent: jsonCreate("/responses", { $merge: [ref("request.extra.agent.responses"), { model: ref("request.model") }] }), agentResponse: { textPaths: ["output_text"], reasoningPaths: ["reasoning.summary.0.text"], toolCallsPath: "output", toolCallIdPaths: ["call_id", "id"], toolCallNamePaths: ["name"], toolCallArgumentsPaths: ["arguments"] }, response: { status: "succeeded", textPaths: ["output_text"], reasoningPaths: ["reasoning.summary.0.text"], usage: ref("response.usage"), errorPaths: ["error.code"], messagePaths: ["error.message"] } }); diff --git a/plugin-packages/openai-chat-completions.yingce-plugin b/plugin-packages/openai-chat-completions.yingce-plugin index ecf5f33e9..82cdde79e 100644 Binary files a/plugin-packages/openai-chat-completions.yingce-plugin and b/plugin-packages/openai-chat-completions.yingce-plugin differ diff --git a/plugin-packages/openai-responses.yingce-plugin b/plugin-packages/openai-responses.yingce-plugin index df88683ab..f0ee2178b 100644 Binary files a/plugin-packages/openai-responses.yingce-plugin and b/plugin-packages/openai-responses.yingce-plugin differ