Aiden Cline 7 bulan lalu
induk
melakukan
f3437d9a49

+ 51 - 3
packages/opencode/src/provider/transform.ts

@@ -125,7 +125,7 @@ export namespace ProviderTransform {
         cacheControl: { type: "ephemeral" },
       },
       openrouter: {
-        cache_control: { type: "ephemeral" },
+        cacheControl: { type: "ephemeral" },
       },
       bedrock: {
         cachePoint: { type: "ephemeral" },
@@ -244,14 +244,21 @@ export namespace ProviderTransform {
     return undefined
   }
 
-  export function thinking(model: Provider.Model, thinking: MessageV2.Thinking) {
-    if (!model.capabilities.reasoning || thinking.effort === "default") return undefined
+  export function thinking(model: Provider.Model, thinking: MessageV2.Thinking): Record<string, any> {
+    if (!model.capabilities.reasoning || thinking.effort === "default") return {}
 
     switch (model.api.npm) {
       case "@openrouter/ai-sdk-provider":
         return {
           reasoning: { effort: thinking.effort },
         }
+
+      case "@ai-sdk/xai":
+      // https://v5.ai-sdk.dev/providers/ai-sdk-providers/xai
+      case "@ai-sdk/deepinfra":
+      // https://v5.ai-sdk.dev/providers/ai-sdk-providers/deepinfra
+      case "@ai-sdk/azure":
+      // https://v5.ai-sdk.dev/providers/ai-sdk-providers/azure
       case "@ai-sdk/openai-compatible":
         const result: Record<string, any> = {
           reasoningEffort: thinking.effort,
@@ -273,7 +280,48 @@ export namespace ProviderTransform {
       case "@ai-sdk/anthropic":
         // TODO: map to thinking budgets
         return {}
+
+      case "@ai-sdk/amazon-bedrock":
+        // TODO: implement bedrock thinking options
+        return {}
+      case "@ai-sdk/google":
+        // TODO: implement google thinking options
+        return {}
+      case "@ai-sdk/google-vertex":
+        // TODO: implement google-vertex thinking options
+        return {}
+      case "@ai-sdk/gateway":
+        // TODO: implement gateway thinking options
+        return {}
+      case "@ai-sdk/mistral":
+        // TODO: implement mistral thinking options
+        // https://v5.ai-sdk.dev/providers/ai-sdk-providers/mistral
+        return {}
+
+      case "@ai-sdk/cerebras":
+        // TODO: implement cerebras thinking options
+        return {}
+      case "@ai-sdk/cohere":
+        // TODO: implement cohere thinking options
+        // https://v5.ai-sdk.dev/providers/ai-sdk-providers/cohere
+        return {}
+
+      case "@ai-sdk/groq":
+        // https://v5.ai-sdk.dev/providers/ai-sdk-providers/groq
+        return {
+          reasoningFormat: "parsed",
+          reasoningEffort: thinking.effort,
+        }
+
+      case "@ai-sdk/perplexity":
+        // https://v5.ai-sdk.dev/providers/ai-sdk-providers/perplexity
+        return {}
+
+      case "@ai-sdk/togetherai":
+        // https://v5.ai-sdk.dev/providers/ai-sdk-providers/togetherai
+        return {}
     }
+    return {}
   }
 
   export function options(

+ 8 - 7
packages/opencode/src/session/llm.ts

@@ -75,6 +75,13 @@ export namespace LLM {
 
     const provider = await Provider.getProvider(input.model.providerID)
 
+    const options = pipe(
+      ProviderTransform.options(input.model, input.sessionID, provider.options),
+      mergeDeep(input.small ? ProviderTransform.smallOptions(input.model) : {}),
+      mergeDeep(input.model.options),
+      mergeDeep(input.agent.options),
+      mergeDeep(input.user.thinking ? ProviderTransform.thinking(input.model, input.user.thinking) : {}),
+    )
     const params = await Plugin.trigger(
       "chat.params",
       {
@@ -90,13 +97,7 @@ export namespace LLM {
           : undefined,
         topP: input.agent.topP ?? ProviderTransform.topP(input.model),
         topK: ProviderTransform.topK(input.model),
-        options: pipe(
-          {},
-          mergeDeep(ProviderTransform.options(input.model, input.sessionID, provider.options)),
-          input.small ? mergeDeep(ProviderTransform.smallOptions(input.model)) : mergeDeep({}),
-          mergeDeep(input.model.options),
-          mergeDeep(input.agent.options),
-        ),
+        options,
       },
     )