@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,117 @@
1
+ /**
2
+ * `DeepSeekBrainDriver` — `OpenAICompatBrainDriver` pointed at DeepSeek's
3
+ * OpenAI-compatible `/v1/chat/completions` endpoint.
4
+ *
5
+ * Inherits the OpenAI-compat overrides (strip `reasoning_effort`,
6
+ * `json_object`-mode generate with schema-in-system-prompt, throws
7
+ * on combined tools + schema) from the base class. Only adds:
8
+ *
9
+ * - Constructor with DeepSeek defaults — base URL
10
+ * `https://api.deepseek.com/v1`, default model `deepseek-chat`.
11
+ *
12
+ * - `mapUsage` override — DeepSeek reports prompt cache hits on
13
+ * the extension field `prompt_cache_hit_tokens` rather than
14
+ * OpenAI's `prompt_tokens_details.cached_tokens`.
15
+ *
16
+ * `countTokens` not implemented (DeepSeek has no count endpoint).
17
+ * `BrainManager.countTokens` returns `null` when routed here.
18
+ */
19
+
20
+ import type OpenAI from 'openai'
21
+ import { BrainError } from '../../brain_error.ts'
22
+ import type { DeepSeekProviderConfig } from '../../brain_config.ts'
23
+ import type { ResolveMcpToolsOptions } from '../../mcp/resolve_mcp_tools.ts'
24
+ import type {
25
+ AudioSource,
26
+ ChatUsage,
27
+ EmbedOptions,
28
+ EmbedResult,
29
+ TranscribeOptions,
30
+ TranscribeResult,
31
+ } from '../../types.ts'
32
+ import { OpenAICompatBrainDriver } from '../openai_compat/openai_compat_brain_driver.ts'
33
+
34
+ const DEFAULT_DEEPSEEK_MODEL = 'deepseek-chat'
35
+ const DEFAULT_DEEPSEEK_BASE_URL = 'https://api.deepseek.com/v1'
36
+
37
+ export interface DeepSeekProviderOptions {
38
+ client?: OpenAI
39
+ /**
40
+ * Internal seam — tests inject a stub MCP client factory so MCP
41
+ * tool resolution doesn't dial the network. Real apps leave it
42
+ * unset; the provider uses the default `MCPClient`.
43
+ */
44
+ mcpClientFactory?: ResolveMcpToolsOptions['clientFactory']
45
+ }
46
+
47
+ export class DeepSeekBrainDriver extends OpenAICompatBrainDriver {
48
+ constructor(
49
+ name: string,
50
+ config: DeepSeekProviderConfig,
51
+ options: DeepSeekProviderOptions = {},
52
+ ) {
53
+ super(
54
+ name,
55
+ {
56
+ driver: 'openai',
57
+ apiKey: config.apiKey,
58
+ baseUrl: config.baseUrl ?? DEFAULT_DEEPSEEK_BASE_URL,
59
+ defaultModel: config.defaultModel ?? DEFAULT_DEEPSEEK_MODEL,
60
+ ...(config.defaultMaxTokens !== undefined
61
+ ? { defaultMaxTokens: config.defaultMaxTokens }
62
+ : {}),
63
+ },
64
+ options,
65
+ )
66
+ }
67
+
68
+ /**
69
+ * DeepSeek doesn't expose an audio transcription endpoint.
70
+ * Override the inherited `transcribe` (from OpenAIBrainDriver) to
71
+ * throw clearly rather than 404 at the wire.
72
+ */
73
+ override async transcribe(
74
+ _audio: AudioSource,
75
+ _options?: TranscribeOptions,
76
+ ): Promise<TranscribeResult<OpenAI.Audio.TranscriptionCreateResponse>> {
77
+ throw new BrainError(
78
+ "DeepSeekBrainDriver.transcribe: DeepSeek's API does not expose audio transcription. Route transcribe calls to a provider with native support — OpenAI / Ollama / Gemini.",
79
+ { context: { provider: this.name } },
80
+ )
81
+ }
82
+
83
+ /**
84
+ * DeepSeek doesn't expose an embeddings endpoint via their
85
+ * OpenAI-compat API. Override the inherited `embed` to throw
86
+ * with a clear message instead of letting the SDK return a
87
+ * confusing 404.
88
+ */
89
+ override async embed(
90
+ _texts: readonly string[],
91
+ _options?: EmbedOptions,
92
+ ): Promise<EmbedResult<OpenAI.CreateEmbeddingResponse>> {
93
+ throw new BrainError(
94
+ `DeepSeekBrainDriver.embed: DeepSeek's API does not expose embeddings. Route embed calls to a provider with native support — OpenAI / Gemini / Ollama.`,
95
+ { context: { provider: this.name } },
96
+ )
97
+ }
98
+
99
+ /**
100
+ * DeepSeek reports cache hits on `prompt_cache_hit_tokens`
101
+ * (extension field on their `CompletionUsage`). Read it first,
102
+ * falling back to OpenAI's `prompt_tokens_details.cached_tokens`
103
+ * when present.
104
+ */
105
+ protected override mapUsage(u: OpenAI.CompletionUsage | undefined): ChatUsage {
106
+ return {
107
+ inputTokens: u?.prompt_tokens ?? 0,
108
+ outputTokens: u?.completion_tokens ?? 0,
109
+ cacheReadTokens:
110
+ ((u as unknown as { prompt_cache_hit_tokens?: number } | undefined)
111
+ ?.prompt_cache_hit_tokens) ??
112
+ u?.prompt_tokens_details?.cached_tokens ??
113
+ 0,
114
+ cacheCreationTokens: 0,
115
+ }
116
+ }
117
+ }
@@ -0,0 +1 @@
1
+ export { DeepSeekBrainDriver } from './deepseek_brain_driver.ts'