Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: build
on: [push, pull_request]

jobs:
build:
uses: charmbracelet/meta/.github/workflows/build.yml@main
with:
go-version: ""
go-version-file: ./go.mod
secrets:
gh_pat: "${{ secrets.PERSONAL_ACCESS_TOKEN }}"
11 changes: 11 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: lint
on:
push:
pull_request:

jobs:
lint:
uses: charmbracelet/meta/.github/workflows/lint.yml@main
with:
golangci_path: .golangci.yml
timeout: 10m
44 changes: 44 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
version: "2"
run:
tests: false
linters:
enable:
- bodyclose
# - exhaustive
# - goconst
- godot
- gomoddirectives
- goprintffuncname
- gosec
- misspell
- nakedret
# - nestif
- nilerr
- noctx
- nolintlint
- prealloc
# - revive
- rowserrcheck
- sqlclosecheck
- tparallel
- unconvert
- unparam
- whitespace
# - wrapcheck
exclusions:
rules:
- text: '(slog|log)\.\w+'
linters:
- noctx
generated: lax
presets:
- common-false-positives
issues:
max-issues-per-linter: 0
max-same-issues: 0
formatters:
enable:
- gofumpt
- goimports
exclusions:
generated: lax
23 changes: 23 additions & 0 deletions Taskfile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: '3'


tasks:
test:
desc: Run tests
cmds:
- go test ./...

lint:
desc: Run linters
cmds:
- golangci-lint run --config .golangci.yml --timeout 10m

lint:fix:
desc: Fix lint issues
cmds:
- golangci-lint run --config .golangci.yml --fix

fmt:
desc: Format code
cmds:
- gofumpt -w .
26 changes: 13 additions & 13 deletions agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult,

// Start step stream
if opts.OnStepStart != nil {
opts.OnStepStart(stepNumber)
_ = opts.OnStepStart(stepNumber)
}

// Create streaming call
Expand Down Expand Up @@ -808,7 +808,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult,

// Call step finished callback
if opts.OnStepFinish != nil {
opts.OnStepFinish(stepResult)
_ = opts.OnStepFinish(stepResult)
}

// Add step messages to response messages
Expand All @@ -834,14 +834,14 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult,
}

if opts.OnAgentFinish != nil {
opts.OnAgentFinish(agentResult)
_ = opts.OnAgentFinish(agentResult)
}

return agentResult, nil
}

func (a *agent) prepareTools(tools []AgentTool, activeTools []string, disableAllTools bool) []Tool {
var preparedTools []Tool
preparedTools := make([]Tool, 0, len(tools))

// If explicitly disabling all tools, return no tools
if disableAllTools {
Expand All @@ -868,7 +868,7 @@ func (a *agent) prepareTools(tools []AgentTool, activeTools []string, disableAll
return preparedTools
}

// validateAndRepairToolCall validates a tool call and attempts repair if validation fails
// validateAndRepairToolCall validates a tool call and attempts repair if validation fails.
func (a *agent) validateAndRepairToolCall(ctx context.Context, toolCall ToolCallContent, availableTools []AgentTool, systemPrompt string, messages []Message, repairFunc RepairToolCallFunction) ToolCallContent {
if err := a.validateToolCall(toolCall, availableTools); err == nil {
return toolCall
Expand Down Expand Up @@ -896,7 +896,7 @@ func (a *agent) validateAndRepairToolCall(ctx context.Context, toolCall ToolCall
}
}

// validateToolCall validates a tool call against available tools and their schemas
// validateToolCall validates a tool call against available tools and their schemas.
func (a *agent) validateToolCall(toolCall ToolCallContent, availableTools []AgentTool) error {
var tool AgentTool
for _, t := range availableTools {
Expand Down Expand Up @@ -1009,7 +1009,7 @@ func WithRepairToolCall(fn RepairToolCallFunction) AgentOption {
}
}

// processStepStream processes a single step's stream and returns the step result
// processStepStream processes a single step's stream and returns the step result.
func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, opts AgentStreamCall, _ []StepResult) (StepResult, bool, error) {
var stepContent []Content
var stepToolCalls []ToolCallContent
Expand Down Expand Up @@ -1065,7 +1065,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op
if text, exists := activeTextContent[part.ID]; exists {
stepContent = append(stepContent, TextContent{
Text: text,
ProviderMetadata: ProviderMetadata(part.ProviderMetadata),
ProviderMetadata: part.ProviderMetadata,
})
delete(activeTextContent, part.ID)
}
Expand Down Expand Up @@ -1100,12 +1100,12 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op
if text, exists := activeTextContent[part.ID]; exists {
stepContent = append(stepContent, ReasoningContent{
Text: text,
ProviderMetadata: ProviderMetadata(part.ProviderMetadata),
ProviderMetadata: part.ProviderMetadata,
})
if opts.OnReasoningEnd != nil {
err := opts.OnReasoningEnd(part.ID, ReasoningContent{
Text: text,
ProviderMetadata: ProviderMetadata(part.ProviderMetadata),
ProviderMetadata: part.ProviderMetadata,
})
if err != nil {
return StepResult{}, false, err
Expand Down Expand Up @@ -1153,7 +1153,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op
ToolName: part.ToolCallName,
Input: part.ToolCallInput,
ProviderExecuted: part.ProviderExecuted,
ProviderMetadata: ProviderMetadata(part.ProviderMetadata),
ProviderMetadata: part.ProviderMetadata,
}

// Validate and potentially repair the tool call
Expand All @@ -1177,7 +1177,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op
ID: part.ID,
URL: part.URL,
Title: part.Title,
ProviderMetadata: ProviderMetadata(part.ProviderMetadata),
ProviderMetadata: part.ProviderMetadata,
}
stepContent = append(stepContent, sourceContent)
if opts.OnSource != nil {
Expand All @@ -1190,7 +1190,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op
case StreamPartTypeFinish:
stepUsage = part.Usage
stepFinishReason = part.FinishReason
stepProviderMetadata = ProviderMetadata(part.ProviderMetadata)
stepProviderMetadata = part.ProviderMetadata
if opts.OnStreamFinish != nil {
err := opts.OnStreamFinish(part.Usage, part.FinishReason, part.ProviderMetadata)
if err != nil {
Expand Down
6 changes: 3 additions & 3 deletions content.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ type ProviderOptions map[string]map[string]any
// - `tool-calls`: model triggered tool calls
// - `error`: model stopped because of an error
// - `other`: model stopped for other reasons
// - `unknown`: the model has not transmitted a finish reason
// - `unknown`: the model has not transmitted a finish reason.
type FinishReason string

const (
Expand Down Expand Up @@ -450,7 +450,7 @@ func (p ProviderDefinedTool) GetName() string {
return p.Name
}

// Helpers
// Helpers.
func NewUserMessage(prompt string, files ...FilePart) Message {
content := []MessagePart{
TextPart{
Expand All @@ -469,7 +469,7 @@ func NewUserMessage(prompt string, files ...FilePart) Message {
}

func NewSystemMessage(prompt ...string) Message {
var content []MessagePart
content := make([]MessagePart, 0, len(prompt))
for _, p := range prompt {
content = append(content, TextPart{Text: p})
}
Expand Down
8 changes: 4 additions & 4 deletions providers/anthropic.go
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ func toAnthropicTools(tools []ai.Tool, toolChoice *ai.ToolChoice, disableParalle
},
}
}
return
return anthropicTools, anthropicToolChoice, warnings
}

switch *toolChoice {
Expand All @@ -401,7 +401,7 @@ func toAnthropicTools(tools []ai.Tool, toolChoice *ai.ToolChoice, disableParalle
},
}
case ai.ToolChoiceNone:
return
return anthropicTools, anthropicToolChoice, warnings
default:
anthropicToolChoice = &anthropic.ToolChoiceUnionParam{
OfTool: &anthropic.ToolChoiceToolParam{
Expand All @@ -411,7 +411,7 @@ func toAnthropicTools(tools []ai.Tool, toolChoice *ai.ToolChoice, disableParalle
},
}
}
return
return anthropicTools, anthropicToolChoice, warnings
}

func toAnthropicPrompt(prompt ai.Prompt, sendReasoningData bool) ([]anthropic.TextBlockParam, []anthropic.MessageParam, []ai.CallWarning) {
Expand Down Expand Up @@ -775,7 +775,7 @@ func (a anthropicLanguageModel) Stream(ctx context.Context, call ai.Call) (ai.St

for stream.Next() {
chunk := stream.Current()
acc.Accumulate(chunk)
_ = acc.Accumulate(chunk)
switch chunk.Type {
case "content_block_start":
contentBlockType := chunk.ContentBlock.Type
Expand Down
8 changes: 4 additions & 4 deletions providers/openai.go
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ func (o openAiLanguageModel) Generate(ctx context.Context, call ai.Call) (*ai.Re
return nil, errors.New("no response generated")
}
choice := response.Choices[0]
var content []ai.Content
content := make([]ai.Content, 0, 1+len(choice.Message.ToolCalls)+len(choice.Message.Annotations))
text := choice.Message.Content
if text != "" {
content = append(content, ai.TextContent{
Expand Down Expand Up @@ -839,7 +839,7 @@ func toOpenAiTools(tools []ai.Tool, toolChoice *ai.ToolChoice) (openAiTools []op
})
}
if toolChoice == nil {
return
return openAiTools, openAiToolChoice, warnings
}

switch *toolChoice {
Expand All @@ -861,7 +861,7 @@ func toOpenAiTools(tools []ai.Tool, toolChoice *ai.ToolChoice) (openAiTools []op
},
}
}
return
return openAiTools, openAiToolChoice, warnings
}

func toOpenAiPrompt(prompt ai.Prompt) ([]openai.ChatCompletionMessageParamUnion, []ai.CallWarning) {
Expand Down Expand Up @@ -1129,7 +1129,7 @@ func toOpenAiPrompt(prompt ai.Prompt) ([]openai.ChatCompletionMessageParamUnion,
return messages, warnings
}

// parseAnnotationsFromDelta parses annotations from the raw JSON of a delta
// parseAnnotationsFromDelta parses annotations from the raw JSON of a delta.
func parseAnnotationsFromDelta(delta openai.ChatCompletionChunkChoiceDelta) []openai.ChatCompletionMessageAnnotation {
var annotations []openai.ChatCompletionMessageAnnotation

Expand Down
Loading