@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.
- package/package.json +23 -7
- package/src/agent.ts +97 -0
- package/src/agent_generate_result.ts +32 -0
- package/src/agent_result.ts +39 -0
- package/src/agent_runner.ts +265 -0
- package/src/agent_stream_event.ts +100 -0
- package/src/brain_config.ts +218 -1
- package/src/brain_driver.ts +247 -0
- package/src/brain_error.ts +86 -10
- package/src/brain_manager.ts +419 -5
- package/src/brain_provider.ts +89 -10
- package/src/define_tool.ts +42 -0
- package/src/drivers/anthropic/anthropic_brain_driver.ts +641 -0
- package/src/drivers/anthropic/anthropic_helpers.ts +65 -0
- package/src/drivers/anthropic/anthropic_message_builder.ts +258 -0
- package/src/drivers/anthropic/anthropic_response_mapper.ts +123 -0
- package/src/drivers/anthropic/anthropic_tool_loop.ts +246 -0
- package/src/drivers/anthropic/index.ts +1 -0
- package/src/drivers/deepseek/deepseek_brain_driver.ts +117 -0
- package/src/drivers/deepseek/index.ts +1 -0
- package/src/drivers/gemini/gemini_brain_driver.ts +1064 -0
- package/src/drivers/gemini/index.ts +1 -0
- package/src/drivers/minimax/index.ts +1 -0
- package/src/drivers/minimax/minimax_brain_driver.ts +84 -0
- package/src/drivers/ollama/index.ts +1 -0
- package/src/drivers/ollama/ollama_brain_driver.ts +86 -0
- package/src/drivers/openai/index.ts +1 -0
- package/src/drivers/openai/openai_brain_driver.ts +796 -0
- package/src/drivers/openai/openai_helpers.ts +58 -0
- package/src/drivers/openai/openai_message_builder.ts +187 -0
- package/src/drivers/openai/openai_response_mapper.ts +70 -0
- package/src/drivers/openai/openai_tool_dispatch.ts +127 -0
- package/src/drivers/openai/openai_tool_loop.ts +191 -0
- package/src/drivers/openai_compat/index.ts +1 -0
- package/src/drivers/openai_compat/openai_compat_brain_driver.ts +616 -0
- package/src/drivers/openai_responses/index.ts +1 -0
- package/src/drivers/openai_responses/openai_responses_brain_driver.ts +1015 -0
- package/src/drivers/openrouter/index.ts +1 -0
- package/src/drivers/openrouter/openrouter_brain_driver.ts +137 -0
- package/src/drivers/qwen/index.ts +1 -0
- package/src/drivers/qwen/qwen_brain_driver.ts +103 -0
- package/src/index.ts +86 -8
- package/src/mcp/client.ts +243 -0
- package/src/mcp/index.ts +23 -0
- package/src/mcp/oauth.ts +227 -0
- package/src/mcp/pool.ts +106 -0
- package/src/mcp/resolve_mcp_tools.ts +108 -0
- package/src/mcp_server.ts +63 -0
- package/src/output_schema.ts +72 -0
- package/src/persistence/brain_message.ts +34 -0
- package/src/persistence/brain_message_repository.ts +98 -0
- package/src/persistence/brain_store.ts +166 -0
- package/src/persistence/brain_suspended_run.ts +30 -0
- package/src/persistence/brain_suspended_run_repository.ts +59 -0
- package/src/persistence/brain_thread.ts +30 -0
- package/src/persistence/brain_thread_repository.ts +56 -0
- package/src/persistence/database_brain_store.ts +190 -0
- package/src/persistence/index.ts +48 -0
- package/src/persistence/schemas/brain_message_schema.ts +61 -0
- package/src/persistence/schemas/brain_suspended_run_schema.ts +58 -0
- package/src/persistence/schemas/brain_thread_schema.ts +50 -0
- package/src/persistence/schemas/index.ts +3 -0
- package/src/suspended_run.ts +153 -0
- package/src/thread.ts +40 -1
- package/src/tool.ts +42 -0
- package/src/tool_execution_error.ts +26 -0
- package/src/tool_runner.ts +81 -0
- package/src/translate/index.ts +19 -0
- package/src/translate/translate_cache.ts +78 -0
- package/src/translate/translate_provider.ts +46 -0
- package/src/translate/translator.ts +271 -0
- package/src/types.ts +431 -1
- package/src/zod/index.ts +121 -0
- package/src/provider.ts +0 -48
- 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'
|