summaryrefslogtreecommitdiffhomepage
path: root/internal/llm/agent
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-18 20:17:38 +0200
committerKujtim Hoxha <[email protected]>2025-04-21 13:42:27 +0200
commit333ea6ec4b2abfc2c1a9c3f6b0918ca5d296347f (patch)
treee0d456417368e8716c81ee43b82be3d6ed39c59e /internal/llm/agent
parent05d0e86f10369fd0e51a924ac88029fb92591499 (diff)
downloadopencode-333ea6ec4b2abfc2c1a9c3f6b0918ca5d296347f.tar.gz
opencode-333ea6ec4b2abfc2c1a9c3f6b0918ca5d296347f.zip
implement patch, update ui, improve rendering
Diffstat (limited to 'internal/llm/agent')
-rw-r--r--internal/llm/agent/agent.go53
-rw-r--r--internal/llm/agent/tools.go3
2 files changed, 35 insertions, 21 deletions
diff --git a/internal/llm/agent/agent.go b/internal/llm/agent/agent.go
index a5dadb89d..5e9785991 100644
--- a/internal/llm/agent/agent.go
+++ b/internal/llm/agent/agent.go
@@ -41,6 +41,7 @@ type Service interface {
Run(ctx context.Context, sessionID string, content string) (<-chan AgentEvent, error)
Cancel(sessionID string)
IsSessionBusy(sessionID string) bool
+ IsBusy() bool
}
type agent struct {
@@ -95,6 +96,20 @@ func (a *agent) Cancel(sessionID string) {
}
}
+func (a *agent) IsBusy() bool {
+ busy := false
+ a.activeRequests.Range(func(key, value interface{}) bool {
+ if cancelFunc, ok := value.(context.CancelFunc); ok {
+ if cancelFunc != nil {
+ busy = true
+ return false // Stop iterating
+ }
+ }
+ return true // Continue iterating
+ })
+ return busy
+}
+
func (a *agent) IsSessionBusy(sessionID string) bool {
_, busy := a.activeRequests.Load(sessionID)
return busy
@@ -313,23 +328,8 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
}
}
a.finishMessage(ctx, &assistantMsg, message.FinishReasonPermissionDenied)
- } else {
- toolResults[i] = message.ToolResult{
- ToolCallID: toolCall.ID,
- Content: toolErr.Error(),
- IsError: true,
- }
- for j := i; j < len(toolCalls); j++ {
- toolResults[j] = message.ToolResult{
- ToolCallID: toolCalls[j].ID,
- Content: "Previous tool failed",
- IsError: true,
- }
- }
- a.finishMessage(ctx, &assistantMsg, message.FinishReasonError)
+ break
}
- // If permission is denied or an error happens we cancel all the following tools
- break
}
toolResults[i] = message.ToolResult{
ToolCallID: toolCall.ID,
@@ -437,12 +437,27 @@ func createAgentProvider(agentName config.AgentName) (provider.Provider, error)
if providerCfg.Disabled {
return nil, fmt.Errorf("provider %s is not enabled", model.Provider)
}
- agentProvider, err := provider.NewProvider(
- model.Provider,
+ maxTokens := model.DefaultMaxTokens
+ if agentConfig.MaxTokens > 0 {
+ maxTokens = agentConfig.MaxTokens
+ }
+ opts := []provider.ProviderClientOption{
provider.WithAPIKey(providerCfg.APIKey),
provider.WithModel(model),
provider.WithSystemMessage(prompt.GetAgentPrompt(agentName, model.Provider)),
- provider.WithMaxTokens(agentConfig.MaxTokens),
+ provider.WithMaxTokens(maxTokens),
+ }
+ if model.Provider == models.ProviderOpenAI && model.CanReason {
+ opts = append(
+ opts,
+ provider.WithOpenAIOptions(
+ provider.WithReasoningEffort(agentConfig.ReasoningEffort),
+ ),
+ )
+ }
+ agentProvider, err := provider.NewProvider(
+ model.Provider,
+ opts...,
)
if err != nil {
return nil, fmt.Errorf("could not create provider: %v", err)
diff --git a/internal/llm/agent/tools.go b/internal/llm/agent/tools.go
index 9120809ff..b2e6816d5 100644
--- a/internal/llm/agent/tools.go
+++ b/internal/llm/agent/tools.go
@@ -31,10 +31,9 @@ func CoderAgentTools(
tools.NewGlobTool(),
tools.NewGrepTool(),
tools.NewLsTool(),
- // TODO: see if we want to use this tool
- // tools.NewPatchTool(lspClients, permissions, history),
tools.NewSourcegraphTool(),
tools.NewViewTool(lspClients),
+ tools.NewPatchTool(lspClients, permissions, history),
tools.NewWriteTool(lspClients, permissions, history),
NewAgentTool(sessions, messages, lspClients),
}, otherTools...,