summaryrefslogtreecommitdiff
path: root/internal/provider/provider.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/provider/provider.go')
-rw-r--r--internal/provider/provider.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/internal/provider/provider.go b/internal/provider/provider.go
new file mode 100644
index 0000000..fd1022d
--- /dev/null
+++ b/internal/provider/provider.go
@@ -0,0 +1,72 @@
+// Package provider defines a provider-neutral chat/tool-use interface. It is
+// independent of any one wire format (OpenAI-compatible, Anthropic Messages,
+// Gemini, etc.) so that internal/agentloop's tool-use control flow can drive
+// any backend that implements Provider.
+//
+// Phase 1 ships exactly one implementation, internal/provider/openaicompat,
+// which adapts the existing internal/llm.Client. Later phases add native
+// Anthropic/OpenAI/Google/Groq/OpenRouter adapters without touching agentloop.
+package provider
+
+import "context"
+
+// Message is one turn in a chat conversation, in provider-neutral shape.
+type Message struct {
+ Role string // "system" | "user" | "assistant" | "tool"
+ Text string
+ ToolCalls []ToolCall // set on assistant turns that invoke tools
+ ToolResults []ToolResult // set on tool-result turns
+}
+
+// ToolCall is a single tool invocation requested by the model.
+type ToolCall struct {
+ ID string
+ Name string
+ ArgsJSON string
+}
+
+// ToolResult is the outcome of executing a ToolCall, fed back to the model.
+type ToolResult struct {
+ ToolCallID string
+ Name string
+ Content string
+ IsError bool
+}
+
+// ToolSpec declares a tool the model may call.
+type ToolSpec struct {
+ Name string
+ Description string
+ ParametersJSONSchema map[string]any
+}
+
+// ChatRequest captures the parameters of a single chat completion call.
+type ChatRequest struct {
+ Model string
+ System string
+ Messages []Message
+ Tools []ToolSpec
+ Temperature *float64
+ MaxTokens int
+}
+
+// Usage reports token accounting and (when known) cost for a single call.
+type Usage struct {
+ InputTokens int
+ OutputTokens int
+ CostUSD float64
+}
+
+// ChatResponse is the aggregated result of a chat completion.
+type ChatResponse struct {
+ Text string
+ ToolCalls []ToolCall
+ StopReason string
+ Usage Usage
+}
+
+// Provider is a chat/tool-use backend: one per LLM vendor/wire-format.
+type Provider interface {
+ Name() string
+ Chat(ctx context.Context, req ChatRequest) (*ChatResponse, error)
+}