@strav/brain 1.0.0-alpha.8 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/package.json +23 -7
  2. package/src/agent.ts +97 -0
  3. package/src/agent_generate_result.ts +32 -0
  4. package/src/agent_result.ts +39 -0
  5. package/src/agent_runner.ts +265 -0
  6. package/src/agent_stream_event.ts +100 -0
  7. package/src/brain_config.ts +218 -1
  8. package/src/brain_driver.ts +247 -0
  9. package/src/brain_error.ts +86 -10
  10. package/src/brain_manager.ts +419 -5
  11. package/src/brain_provider.ts +89 -10
  12. package/src/define_tool.ts +42 -0
  13. package/src/drivers/anthropic/anthropic_brain_driver.ts +641 -0
  14. package/src/drivers/anthropic/anthropic_helpers.ts +65 -0
  15. package/src/drivers/anthropic/anthropic_message_builder.ts +258 -0
  16. package/src/drivers/anthropic/anthropic_response_mapper.ts +123 -0
  17. package/src/drivers/anthropic/anthropic_tool_loop.ts +246 -0
  18. package/src/drivers/anthropic/index.ts +1 -0
  19. package/src/drivers/deepseek/deepseek_brain_driver.ts +117 -0
  20. package/src/drivers/deepseek/index.ts +1 -0
  21. package/src/drivers/gemini/gemini_brain_driver.ts +1064 -0
  22. package/src/drivers/gemini/index.ts +1 -0
  23. package/src/drivers/minimax/index.ts +1 -0
  24. package/src/drivers/minimax/minimax_brain_driver.ts +84 -0
  25. package/src/drivers/ollama/index.ts +1 -0
  26. package/src/drivers/ollama/ollama_brain_driver.ts +86 -0
  27. package/src/drivers/openai/index.ts +1 -0
  28. package/src/drivers/openai/openai_brain_driver.ts +796 -0
  29. package/src/drivers/openai/openai_helpers.ts +58 -0
  30. package/src/drivers/openai/openai_message_builder.ts +187 -0
  31. package/src/drivers/openai/openai_response_mapper.ts +70 -0
  32. package/src/drivers/openai/openai_tool_dispatch.ts +127 -0
  33. package/src/drivers/openai/openai_tool_loop.ts +191 -0
  34. package/src/drivers/openai_compat/index.ts +1 -0
  35. package/src/drivers/openai_compat/openai_compat_brain_driver.ts +616 -0
  36. package/src/drivers/openai_responses/index.ts +1 -0
  37. package/src/drivers/openai_responses/openai_responses_brain_driver.ts +1015 -0
  38. package/src/drivers/openrouter/index.ts +1 -0
  39. package/src/drivers/openrouter/openrouter_brain_driver.ts +137 -0
  40. package/src/drivers/qwen/index.ts +1 -0
  41. package/src/drivers/qwen/qwen_brain_driver.ts +103 -0
  42. package/src/index.ts +86 -8
  43. package/src/mcp/client.ts +243 -0
  44. package/src/mcp/index.ts +23 -0
  45. package/src/mcp/oauth.ts +227 -0
  46. package/src/mcp/pool.ts +106 -0
  47. package/src/mcp/resolve_mcp_tools.ts +108 -0
  48. package/src/mcp_server.ts +63 -0
  49. package/src/output_schema.ts +72 -0
  50. package/src/persistence/brain_message.ts +34 -0
  51. package/src/persistence/brain_message_repository.ts +98 -0
  52. package/src/persistence/brain_store.ts +166 -0
  53. package/src/persistence/brain_suspended_run.ts +30 -0
  54. package/src/persistence/brain_suspended_run_repository.ts +59 -0
  55. package/src/persistence/brain_thread.ts +30 -0
  56. package/src/persistence/brain_thread_repository.ts +56 -0
  57. package/src/persistence/database_brain_store.ts +190 -0
  58. package/src/persistence/index.ts +48 -0
  59. package/src/persistence/schemas/brain_message_schema.ts +61 -0
  60. package/src/persistence/schemas/brain_suspended_run_schema.ts +58 -0
  61. package/src/persistence/schemas/brain_thread_schema.ts +50 -0
  62. package/src/persistence/schemas/index.ts +3 -0
  63. package/src/suspended_run.ts +153 -0
  64. package/src/thread.ts +40 -1
  65. package/src/tool.ts +42 -0
  66. package/src/tool_execution_error.ts +26 -0
  67. package/src/tool_runner.ts +81 -0
  68. package/src/translate/index.ts +19 -0
  69. package/src/translate/translate_cache.ts +78 -0
  70. package/src/translate/translate_provider.ts +46 -0
  71. package/src/translate/translator.ts +271 -0
  72. package/src/types.ts +431 -1
  73. package/src/zod/index.ts +121 -0
  74. package/src/provider.ts +0 -48
  75. package/src/providers/anthropic_provider.ts +0 -227
@@ -0,0 +1 @@
1
+ export { GeminiBrainDriver } from './gemini_brain_driver.ts'
@@ -0,0 +1 @@
1
+ export { MiniMaxBrainDriver } from './minimax_brain_driver.ts'
@@ -0,0 +1,84 @@
1
+ /**
2
+ * `MiniMaxBrainDriver` — `OpenAICompatBrainDriver` pointed at
3
+ * MiniMax's OpenAI-compatible endpoint at `https://api.minimax.io/v1`.
4
+ *
5
+ * MiniMax (M2, abab line) speaks the OpenAI Chat Completions wire
6
+ * format and supports function-calling, so the OpenAI-compat base
7
+ * already covers chat / stream / generate (via `json_object`) /
8
+ * runWithToolsAndSchema (via tool-forcing).
9
+ *
10
+ * MiniMax has a `reasoning_split=true` flag that surfaces the
11
+ * assistant's reasoning trace on a separate `reasoning_details`
12
+ * field. Not wired in V1 — `effort` / `thinking` are stripped by
13
+ * the OpenAI-compat `buildParams` override and apps reach for
14
+ * reasoning surfaces via the Anthropic / Gemini / OpenAI Responses
15
+ * drivers.
16
+ *
17
+ * `embed` / `transcribe` are not exposed via the compatibility
18
+ * endpoint; the inherited stubs are replaced with explicit
19
+ * `BrainError`s so apps see a clear message instead of a wire 404.
20
+ */
21
+
22
+ import type OpenAI from 'openai'
23
+ import type { MiniMaxProviderConfig } from '../../brain_config.ts'
24
+ import { BrainError } from '../../brain_error.ts'
25
+ import type { ResolveMcpToolsOptions } from '../../mcp/resolve_mcp_tools.ts'
26
+ import type {
27
+ AudioSource,
28
+ EmbedOptions,
29
+ EmbedResult,
30
+ TranscribeOptions,
31
+ TranscribeResult,
32
+ } from '../../types.ts'
33
+ import { OpenAICompatBrainDriver } from '../openai_compat/openai_compat_brain_driver.ts'
34
+
35
+ const DEFAULT_MINIMAX_MODEL = 'MiniMax-M2'
36
+ const DEFAULT_MINIMAX_BASE_URL = 'https://api.minimax.io/v1'
37
+
38
+ export interface MiniMaxProviderOptions {
39
+ client?: OpenAI
40
+ /**
41
+ * Internal seam — tests inject a stub MCP client factory so MCP
42
+ * tool resolution doesn't dial the network. Real apps leave it
43
+ * unset; the provider uses the default `MCPClient`.
44
+ */
45
+ mcpClientFactory?: ResolveMcpToolsOptions['clientFactory']
46
+ }
47
+
48
+ export class MiniMaxBrainDriver extends OpenAICompatBrainDriver {
49
+ constructor(name: string, config: MiniMaxProviderConfig, options: MiniMaxProviderOptions = {}) {
50
+ super(
51
+ name,
52
+ {
53
+ driver: 'openai',
54
+ apiKey: config.apiKey,
55
+ baseUrl: config.baseUrl ?? DEFAULT_MINIMAX_BASE_URL,
56
+ defaultModel: config.defaultModel ?? DEFAULT_MINIMAX_MODEL,
57
+ ...(config.defaultMaxTokens !== undefined
58
+ ? { defaultMaxTokens: config.defaultMaxTokens }
59
+ : {}),
60
+ },
61
+ options,
62
+ )
63
+ }
64
+
65
+ override async embed(
66
+ _texts: readonly string[],
67
+ _options?: EmbedOptions,
68
+ ): Promise<EmbedResult<OpenAI.CreateEmbeddingResponse>> {
69
+ throw new BrainError(
70
+ `MiniMaxBrainDriver.embed: MiniMax's OpenAI-compatibility endpoint does not expose embeddings. Route embed calls to a provider with native support — OpenAI / Gemini / Ollama.`,
71
+ { context: { provider: this.name } },
72
+ )
73
+ }
74
+
75
+ override async transcribe(
76
+ _audio: AudioSource,
77
+ _options?: TranscribeOptions,
78
+ ): Promise<TranscribeResult<OpenAI.Audio.TranscriptionCreateResponse>> {
79
+ throw new BrainError(
80
+ "MiniMaxBrainDriver.transcribe: MiniMax's OpenAI-compatibility endpoint does not expose audio transcription. Route transcribe calls to a provider with native support — OpenAI / Ollama / Gemini.",
81
+ { context: { provider: this.name } },
82
+ )
83
+ }
84
+ }
@@ -0,0 +1 @@
1
+ export { OllamaBrainDriver } from './ollama_brain_driver.ts'
@@ -0,0 +1,86 @@
1
+ /**
2
+ * `OllamaBrainDriver` — `OpenAICompatBrainDriver` pointed at a local
3
+ * Ollama server's OpenAI-compatible `/v1` endpoint.
4
+ *
5
+ * Why this matters: Ollama (and the wider local-LLM ecosystem —
6
+ * LM Studio, llama.cpp's server, vLLM, TGI) lets apps run
7
+ * inference on-device or on-prem. Two real use cases:
8
+ *
9
+ * - **Privacy.** Data never leaves the machine / the customer's
10
+ * network — table stakes for regulated workloads.
11
+ * - **Dev / test.** Build agents without burning API credits or
12
+ * needing a cloud key at all. Run the test suite against a
13
+ * local `llama3.2:1b` for free; ship to a hosted provider in
14
+ * prod.
15
+ *
16
+ * Inherits the OpenAI-compat overrides (strip `reasoning_effort`,
17
+ * `json_object`-mode generate with schema-in-system-prompt,
18
+ * throws on combined tools + schema) from the base. Only adds:
19
+ *
20
+ * - Constructor with Ollama defaults — base URL
21
+ * `http://localhost:11434/v1`, placeholder API key `'ollama'`
22
+ * (the SDK demands a non-empty string; Ollama ignores it).
23
+ *
24
+ * `defaultModel` is required because Ollama models are
25
+ * user-installed via `ollama pull <model>` — no universal default
26
+ * exists. Tool calling depends on the underlying model; pick a
27
+ * function-calling-tuned model (`llama3.2`, `qwen2.5`, `mistral`)
28
+ * for `runWithTools` to behave.
29
+ *
30
+ * The same provider works against any OpenAI-compatible local
31
+ * server by overriding `baseUrl` — LM Studio (`:1234/v1`),
32
+ * llama.cpp's server (`:8080/v1`), vLLM, TGI, remote Ollama on
33
+ * another host. The driver name is `ollama` for ergonomic reasons;
34
+ * the implementation is "any OpenAI-compatible local server."
35
+ *
36
+ * Local inference has no upstream prompt cache, so the default
37
+ * `mapUsage` (cache fields → 0) is correct without override.
38
+ * `countTokens` not implemented (Ollama doesn't expose a count
39
+ * endpoint).
40
+ */
41
+
42
+ import type OpenAI from 'openai'
43
+ import type { OllamaProviderConfig } from '../../brain_config.ts'
44
+ import type { ResolveMcpToolsOptions } from '../../mcp/resolve_mcp_tools.ts'
45
+ import { OpenAICompatBrainDriver } from '../openai_compat/openai_compat_brain_driver.ts'
46
+
47
+ const DEFAULT_OLLAMA_BASE_URL = 'http://localhost:11434/v1'
48
+ const DEFAULT_OLLAMA_API_KEY = 'ollama'
49
+
50
+ export interface OllamaProviderOptions {
51
+ client?: OpenAI
52
+ /**
53
+ * Internal seam — tests inject a stub MCP client factory so MCP
54
+ * tool resolution doesn't dial the network. Real apps leave it
55
+ * unset; the provider uses the default `MCPClient`.
56
+ */
57
+ mcpClientFactory?: ResolveMcpToolsOptions['clientFactory']
58
+ }
59
+
60
+ export class OllamaBrainDriver extends OpenAICompatBrainDriver {
61
+ constructor(
62
+ name: string,
63
+ config: OllamaProviderConfig,
64
+ options: OllamaProviderOptions = {},
65
+ ) {
66
+ super(
67
+ name,
68
+ {
69
+ driver: 'openai',
70
+ apiKey: config.apiKey ?? DEFAULT_OLLAMA_API_KEY,
71
+ baseUrl: config.baseUrl ?? DEFAULT_OLLAMA_BASE_URL,
72
+ defaultModel: config.defaultModel,
73
+ ...(config.defaultMaxTokens !== undefined
74
+ ? { defaultMaxTokens: config.defaultMaxTokens }
75
+ : {}),
76
+ ...(config.defaultEmbedModel !== undefined
77
+ ? { defaultEmbedModel: config.defaultEmbedModel }
78
+ : {}),
79
+ ...(config.defaultTranscribeModel !== undefined
80
+ ? { defaultTranscribeModel: config.defaultTranscribeModel }
81
+ : {}),
82
+ },
83
+ options,
84
+ )
85
+ }
86
+ }
@@ -0,0 +1 @@
1
+ export { OpenAIBrainDriver } from './openai_brain_driver.ts'