feat: OpenAI, Anthropic, and native-Ollama providers + media pipeline

Phase 3:
- provider/openai: Chat Completions for OpenAI + compat endpoints (SSE
  streaming with by-index tool-call assembly, response_format json_schema,
  legacy max_tokens option, reasoning_effort)
- provider/anthropic: Messages API (tool_use/tool_result, GA structured
  output via output_config.format, full SSE event parser, 529 transient)
- provider/ollama: one native /api/chat client behind the ollama,
  ollama-cloud, and foreman built-ins (presets; NDJSON streaming tolerant
  of foreman's buffered single-object responses; object tool arguments;
  format-schema structured output; think mapping)
- media/: capability normalization (sniff, downscale, transcode, byte
  ladder, ErrUnsupported), wired into the chain executor per target with
  penalty-free advance past incapable elements
- registry: real provider + scheme wiring, WithHTTPClient option, required
  env-foreman TLS chat round-trip test
- ADR-0009 multimodal strategy, ADR-0010 tools/structured mapping; README
  matrix + CLAUDE.md synced

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 12:58:08 +02:00
parent 323558ed72
commit 043249e0e1
31 changed files with 6194 additions and 74 deletions
+16 -16
View File
@@ -80,26 +80,26 @@ var ErrModelNotFound = llm.ErrModelNotFound
var ErrUnsupported = llm.ErrUnsupported
// Re-exported content and message constructors.
func Text(s string) Part { return llm.Text(s) }
func Image(mime string, data []byte) Part { return llm.Image(mime, data) }
func SystemText(s string) Message { return llm.SystemText(s) }
func UserText(s string) Message { return llm.UserText(s) }
func UserParts(parts ...Part) Message { return llm.UserParts(parts...) }
func AssistantText(s string) Message { return llm.AssistantText(s) }
func Text(s string) Part { return llm.Text(s) }
func Image(mime string, data []byte) Part { return llm.Image(mime, data) }
func SystemText(s string) Message { return llm.SystemText(s) }
func UserText(s string) Message { return llm.UserText(s) }
func UserParts(parts ...Part) Message { return llm.UserParts(parts...) }
func AssistantText(s string) Message { return llm.AssistantText(s) }
func ToolResultsMessage(results ...ToolResult) Message { return llm.ToolResultsMessage(results...) }
func NewToolbox(name string, tools ...Tool) *Toolbox { return llm.NewToolbox(name, tools...) }
func NewToolbox(name string, tools ...Tool) *Toolbox { return llm.NewToolbox(name, tools...) }
// Re-exported request options.
func WithSystem(s string) Option { return llm.WithSystem(s) }
func WithTools(tools ...Tool) Option { return llm.WithTools(tools...) }
func WithToolbox(b *Toolbox) Option { return llm.WithToolbox(b) }
func WithToolChoice(choice string) Option { return llm.WithToolChoice(choice) }
func WithSystem(s string) Option { return llm.WithSystem(s) }
func WithTools(tools ...Tool) Option { return llm.WithTools(tools...) }
func WithToolbox(b *Toolbox) Option { return llm.WithToolbox(b) }
func WithToolChoice(choice string) Option { return llm.WithToolChoice(choice) }
func WithSchema(schema json.RawMessage, name string) Option { return llm.WithSchema(schema, name) }
func WithTemperature(t float64) Option { return llm.WithTemperature(t) }
func WithTopP(p float64) Option { return llm.WithTopP(p) }
func WithMaxTokens(n int) Option { return llm.WithMaxTokens(n) }
func WithStopSequences(stops ...string) Option { return llm.WithStopSequences(stops...) }
func WithReasoningEffort(level string) Option { return llm.WithReasoningEffort(level) }
func WithTemperature(t float64) Option { return llm.WithTemperature(t) }
func WithTopP(p float64) Option { return llm.WithTopP(p) }
func WithMaxTokens(n int) Option { return llm.WithMaxTokens(n) }
func WithStopSequences(stops ...string) Option { return llm.WithStopSequences(stops...) }
func WithReasoningEffort(level string) Option { return llm.WithReasoningEffort(level) }
// WithModelCapabilities re-exports llm.WithCapabilities for Provider.Model
// calls made through this package.