-
-
Notifications
You must be signed in to change notification settings - Fork 93
fix(opencode_go): inject default reasoning effort when unset #775
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,78 @@ | ||
| package opencodego | ||
|
|
||
| import ( | ||
| "os" | ||
| "strings" | ||
|
|
||
| "github.com/enterpilot/gomodel/internal/core" | ||
| "github.com/enterpilot/gomodel/internal/providers" | ||
| ) | ||
|
|
||
| // defaultReasoningEffortEnvVar names the override for the reasoning effort | ||
| // injected when a client sends no reasoning parameter at all. | ||
| const defaultReasoningEffortEnvVar = "OPENCODE_GO_DEFAULT_REASONING_EFFORT" | ||
|
|
||
| // defaultReasoningEffort is injected when the client omits reasoning. Some | ||
| // OpenCode Zen models always think and reject a request that leaves the | ||
| // parameter out ("This model always engages in thinking and cannot be | ||
| // disabled; please use low, high, or max"), so an absent parameter must not | ||
| // read as "thinking off". "low" is the cheapest level those models accept; | ||
| // raise it with OPENCODE_GO_DEFAULT_REASONING_EFFORT. Models that ignore the | ||
| // parameter are unaffected. | ||
| const defaultReasoningEffort = "low" | ||
|
|
||
| // adaptChatRequest returns the AdaptChatRequest hook for OpenCode Zen's | ||
| // /chat/completions dialect. It maps GoModel's nested reasoning shape onto the | ||
| // top-level "reasoning_effort" string the upstream documents, and fills in | ||
| // defaultEffort when the client asked for no reasoning at all. An empty | ||
| // defaultEffort disables injection. | ||
| func adaptChatRequest(defaultEffort string) func(*core.ChatRequest) (*core.ChatRequest, error) { | ||
| return func(req *core.ChatRequest) (*core.ChatRequest, error) { | ||
| if req == nil { | ||
| return req, nil | ||
| } | ||
| // GoModel's nested reasoning.effort is the canonical field: as with | ||
| // every other provider using AdaptReasoningEffortRequest, it wins over | ||
| // a flat reasoning_effort the client sent alongside it. | ||
| if req.Reasoning != nil && strings.TrimSpace(req.Reasoning.Effort) != "" { | ||
| return providers.AdaptReasoningEffortRequest(req, normalizeReasoningEffort(req.Reasoning.Effort)) | ||
|
SantiagoDePolonia marked this conversation as resolved.
|
||
| } | ||
| // Nothing canonical to map: a client that speaks the flat wire shape | ||
| // asked for reasoning too, so the default must not overwrite it. | ||
| if defaultEffort == "" || req.ExtraFields.Lookup("reasoning_effort") != nil { | ||
| return req, nil | ||
| } | ||
| return providers.AdaptReasoningEffortRequest(req, defaultEffort) | ||
| } | ||
| } | ||
|
|
||
| // normalizeReasoningEffort maps GoModel's effort levels onto the low/high/max | ||
| // set OpenCode Zen accepts, downgrading the levels it does not know to their | ||
| // nearest supported equivalent. "none" becomes "low" because the models that | ||
| // enforce this cannot turn thinking off. Values outside GoModel's vocabulary | ||
| // pass through for the upstream to judge. | ||
| func normalizeReasoningEffort(effort string) string { | ||
| normalized := strings.ToLower(strings.TrimSpace(effort)) | ||
| switch normalized { | ||
| case "none", "minimal", "low", "medium": | ||
| return "low" | ||
| case "xhigh", "max": | ||
| return "max" | ||
| default: | ||
| return normalized | ||
| } | ||
| } | ||
|
|
||
| // loadDefaultReasoningEffort resolves the effort injected for requests without | ||
| // reasoning, honoring OPENCODE_GO_DEFAULT_REASONING_EFFORT. "none" and "off" | ||
| // disable injection for operators whose upstream models reject the parameter. | ||
| func loadDefaultReasoningEffort() string { | ||
| override := strings.TrimSpace(os.Getenv(defaultReasoningEffortEnvVar)) | ||
| if override == "" { | ||
| return defaultReasoningEffort | ||
| } | ||
| if strings.EqualFold(override, "none") || strings.EqualFold(override, "off") { | ||
| return "" | ||
| } | ||
| return normalizeReasoningEffort(override) | ||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.