universal-llm-client 4.5.0 → 4.5.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 (174) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +2 -0
  3. package/dist/ai-model.d.ts +0 -1
  4. package/dist/ai-model.js +0 -1
  5. package/dist/auditor.d.ts +0 -1
  6. package/dist/auditor.js +0 -1
  7. package/dist/client.d.ts +0 -1
  8. package/dist/client.js +0 -1
  9. package/dist/gemma-channel.d.ts +0 -1
  10. package/dist/gemma-channel.js +0 -1
  11. package/dist/gemma-diffusion.d.ts +0 -1
  12. package/dist/gemma-diffusion.js +0 -1
  13. package/dist/http.d.ts +0 -1
  14. package/dist/http.js +0 -1
  15. package/dist/index.d.ts +0 -1
  16. package/dist/index.js +0 -1
  17. package/dist/interfaces.d.ts +0 -1
  18. package/dist/interfaces.js +0 -1
  19. package/dist/mcp.d.ts +0 -1
  20. package/dist/mcp.js +0 -1
  21. package/dist/providers/anthropic.d.ts +0 -1
  22. package/dist/providers/anthropic.js +0 -1
  23. package/dist/providers/google.d.ts +0 -1
  24. package/dist/providers/google.js +0 -1
  25. package/dist/providers/index.d.ts +0 -1
  26. package/dist/providers/index.js +0 -1
  27. package/dist/providers/ollama.d.ts +0 -1
  28. package/dist/providers/ollama.js +0 -1
  29. package/dist/providers/openai.d.ts +2 -1
  30. package/dist/providers/openai.js +303 -74
  31. package/dist/router.d.ts +0 -1
  32. package/dist/router.js +0 -1
  33. package/dist/stream-decoder.d.ts +0 -1
  34. package/dist/stream-decoder.js +0 -1
  35. package/dist/structured-output.d.ts +0 -1
  36. package/dist/structured-output.js +0 -1
  37. package/dist/thinking.d.ts +0 -1
  38. package/dist/thinking.js +0 -1
  39. package/dist/tools.d.ts +0 -1
  40. package/dist/tools.js +0 -1
  41. package/dist/zod-adapter.d.ts +0 -1
  42. package/dist/zod-adapter.js +0 -1
  43. package/package.json +1 -2
  44. package/dist/ai-model.d.ts.map +0 -1
  45. package/dist/ai-model.js.map +0 -1
  46. package/dist/auditor.d.ts.map +0 -1
  47. package/dist/auditor.js.map +0 -1
  48. package/dist/client.d.ts.map +0 -1
  49. package/dist/client.js.map +0 -1
  50. package/dist/gemma-channel.d.ts.map +0 -1
  51. package/dist/gemma-channel.js.map +0 -1
  52. package/dist/gemma-diffusion.d.ts.map +0 -1
  53. package/dist/gemma-diffusion.js.map +0 -1
  54. package/dist/http.d.ts.map +0 -1
  55. package/dist/http.js.map +0 -1
  56. package/dist/index.d.ts.map +0 -1
  57. package/dist/index.js.map +0 -1
  58. package/dist/interfaces.d.ts.map +0 -1
  59. package/dist/interfaces.js.map +0 -1
  60. package/dist/mcp.d.ts.map +0 -1
  61. package/dist/mcp.js.map +0 -1
  62. package/dist/providers/anthropic.d.ts.map +0 -1
  63. package/dist/providers/anthropic.js.map +0 -1
  64. package/dist/providers/google.d.ts.map +0 -1
  65. package/dist/providers/google.js.map +0 -1
  66. package/dist/providers/index.d.ts.map +0 -1
  67. package/dist/providers/index.js.map +0 -1
  68. package/dist/providers/ollama.d.ts.map +0 -1
  69. package/dist/providers/ollama.js.map +0 -1
  70. package/dist/providers/openai.d.ts.map +0 -1
  71. package/dist/providers/openai.js.map +0 -1
  72. package/dist/router.d.ts.map +0 -1
  73. package/dist/router.js.map +0 -1
  74. package/dist/stream-decoder.d.ts.map +0 -1
  75. package/dist/stream-decoder.js.map +0 -1
  76. package/dist/structured-output.d.ts.map +0 -1
  77. package/dist/structured-output.js.map +0 -1
  78. package/dist/thinking.d.ts.map +0 -1
  79. package/dist/thinking.js.map +0 -1
  80. package/dist/tools.d.ts.map +0 -1
  81. package/dist/tools.js.map +0 -1
  82. package/dist/zod-adapter.d.ts.map +0 -1
  83. package/dist/zod-adapter.js.map +0 -1
  84. package/src/ai-model.ts +0 -400
  85. package/src/auditor.ts +0 -213
  86. package/src/client.ts +0 -402
  87. package/src/debug/debug-google-streaming.ts +0 -97
  88. package/src/debug/debug-tool-execution.ts +0 -86
  89. package/src/debug/test-lmstudio-tools.ts +0 -155
  90. package/src/demos/README.md +0 -47
  91. package/src/demos/basic/universal-llm-examples.ts +0 -161
  92. package/src/demos/diffusion-gemma/.env +0 -29
  93. package/src/demos/diffusion-gemma/.env.example +0 -27
  94. package/src/demos/diffusion-gemma/CLAUDE.md +0 -95
  95. package/src/demos/diffusion-gemma/README.md +0 -59
  96. package/src/demos/diffusion-gemma/canvas.ts +0 -1606
  97. package/src/demos/diffusion-gemma/docker-compose.yml +0 -29
  98. package/src/demos/diffusion-gemma/probe-stream.ts +0 -51
  99. package/src/demos/diffusion-gemma/probe-tools.ts +0 -55
  100. package/src/demos/diffusion-gemma/server.ts +0 -1205
  101. package/src/demos/diffusion-gemma/start-vllm.sh +0 -98
  102. package/src/demos/mcp/astrid-memory-demo.ts +0 -295
  103. package/src/demos/mcp/astrid-persona-memory.ts +0 -357
  104. package/src/demos/mcp/mcp-mongodb-demo.ts +0 -275
  105. package/src/demos/mcp/simple-astrid-memory.ts +0 -148
  106. package/src/demos/mcp/simple-mcp-demo.ts +0 -68
  107. package/src/demos/mcp/working-mcp-demo.ts +0 -62
  108. package/src/demos/model-alias-demo.ts +0 -0
  109. package/src/demos/tools/RAG_MEMORY_INTEGRATION.md +0 -267
  110. package/src/demos/tools/astrid-memory-demo.ts +0 -270
  111. package/src/demos/tools/astrid-production-memory-clean.ts +0 -785
  112. package/src/demos/tools/astrid-production-memory.ts +0 -558
  113. package/src/demos/tools/basic-translation-test.ts +0 -66
  114. package/src/demos/tools/chromadb-similarity-tuning.ts +0 -390
  115. package/src/demos/tools/clean-multilingual-conversation.ts +0 -209
  116. package/src/demos/tools/clean-translation-test.ts +0 -119
  117. package/src/demos/tools/clean-universal-multilingual-test.ts +0 -131
  118. package/src/demos/tools/complete-rag-demo.ts +0 -369
  119. package/src/demos/tools/complete-tool-demo.ts +0 -132
  120. package/src/demos/tools/demo-tool-calling.ts +0 -124
  121. package/src/demos/tools/dynamic-language-switching-test.ts +0 -251
  122. package/src/demos/tools/hybrid-thinking-test.ts +0 -154
  123. package/src/demos/tools/memory-integration-test.ts +0 -420
  124. package/src/demos/tools/multilingual-memory-system.ts +0 -802
  125. package/src/demos/tools/ondemand-translation-demo.ts +0 -655
  126. package/src/demos/tools/production-tool-demo.ts +0 -245
  127. package/src/demos/tools/revolutionary-multilingual-test.ts +0 -151
  128. package/src/demos/tools/rigorous-language-analysis.ts +0 -218
  129. package/src/demos/tools/test-universal-memory-system.ts +0 -126
  130. package/src/demos/tools/translation-integration-guide.ts +0 -346
  131. package/src/demos/tools/universal-memory-system.ts +0 -560
  132. package/src/gemma-channel.ts +0 -47
  133. package/src/gemma-diffusion.ts +0 -167
  134. package/src/http.ts +0 -261
  135. package/src/index.ts +0 -180
  136. package/src/interfaces.ts +0 -843
  137. package/src/mcp.ts +0 -345
  138. package/src/providers/anthropic.ts +0 -796
  139. package/src/providers/google.ts +0 -840
  140. package/src/providers/index.ts +0 -8
  141. package/src/providers/ollama.ts +0 -503
  142. package/src/providers/openai.ts +0 -587
  143. package/src/router.ts +0 -785
  144. package/src/stream-decoder.ts +0 -535
  145. package/src/structured-output.ts +0 -759
  146. package/src/test-scripts/test-advanced-tools.ts +0 -310
  147. package/src/test-scripts/test-google-deep-research.ts +0 -33
  148. package/src/test-scripts/test-google-streaming-enhanced.ts +0 -147
  149. package/src/test-scripts/test-google-streaming.ts +0 -63
  150. package/src/test-scripts/test-google-system-prompt-comprehensive.ts +0 -189
  151. package/src/test-scripts/test-google-thinking.ts +0 -46
  152. package/src/test-scripts/test-mcp-config.ts +0 -28
  153. package/src/test-scripts/test-mcp-connection.ts +0 -29
  154. package/src/test-scripts/test-system-message-positions.ts +0 -163
  155. package/src/test-scripts/test-system-prompt-improvement-demo.ts +0 -83
  156. package/src/test-scripts/test-tool-calling.ts +0 -231
  157. package/src/test-scripts/test-vllm-qwen36.ts +0 -256
  158. package/src/tests/ai-model.test.ts +0 -1614
  159. package/src/tests/auditor.test.ts +0 -224
  160. package/src/tests/gemma-diffusion.test.ts +0 -115
  161. package/src/tests/http.test.ts +0 -200
  162. package/src/tests/interfaces.test.ts +0 -117
  163. package/src/tests/providers/anthropic.test.ts +0 -118
  164. package/src/tests/providers/google.test.ts +0 -841
  165. package/src/tests/providers/ollama.test.ts +0 -1034
  166. package/src/tests/providers/openai.test.ts +0 -1511
  167. package/src/tests/router.test.ts +0 -254
  168. package/src/tests/stream-decoder.test.ts +0 -263
  169. package/src/tests/structured-output.test.ts +0 -1450
  170. package/src/tests/thinking.test.ts +0 -65
  171. package/src/tests/tools.test.ts +0 -175
  172. package/src/thinking.ts +0 -73
  173. package/src/tools.ts +0 -246
  174. package/src/zod-adapter.ts +0 -72
@@ -1,118 +0,0 @@
1
- /**
2
- * Anthropic Provider — unified thinking flag tests.
3
- *
4
- * Validates that the model-level `thinking` config and per-call
5
- * `ChatOptions.thinking` map to Anthropic extended thinking
6
- * (`thinking: { type: 'enabled', budget_tokens }`), with the API's
7
- * constraints handled (budget < max_tokens; temperature omitted when on).
8
- */
9
-
10
- import { describe, test, expect, mock, beforeEach, afterEach } from 'bun:test';
11
- import { AnthropicClient } from '../../providers/anthropic.js';
12
- import type { LLMClientOptions } from '../../interfaces.js';
13
- import { AIModelApiType } from '../../interfaces.js';
14
-
15
- function createClient(overrides?: Partial<LLMClientOptions>): AnthropicClient {
16
- return new AnthropicClient({
17
- model: 'claude-sonnet-4-5',
18
- apiKey: 'test-api-key',
19
- apiType: AIModelApiType.Anthropic,
20
- ...overrides,
21
- });
22
- }
23
-
24
- const ANTHROPIC_RESPONSE = {
25
- id: 'msg_1',
26
- type: 'message',
27
- role: 'assistant',
28
- content: [{ type: 'text', text: 'Hi there.' }],
29
- model: 'claude-sonnet-4-5',
30
- stop_reason: 'end_turn',
31
- usage: { input_tokens: 5, output_tokens: 3 },
32
- };
33
-
34
- describe('AnthropicClient thinking flag', () => {
35
- let originalFetch: typeof globalThis.fetch;
36
- beforeEach(() => { originalFetch = globalThis.fetch; });
37
- afterEach(() => { globalThis.fetch = originalFetch; });
38
-
39
- function mockFetchAndCapture(response: unknown = ANTHROPIC_RESPONSE, status = 200) {
40
- let capturedBody: Record<string, unknown> | null = null;
41
- globalThis.fetch = mock(async (_input: string | URL | Request, init?: RequestInit) => {
42
- if (init?.body) capturedBody = JSON.parse(init.body as string);
43
- return new Response(JSON.stringify(response), {
44
- status,
45
- headers: { 'Content-Type': 'application/json' },
46
- });
47
- }) as typeof fetch;
48
- return () => capturedBody;
49
- }
50
-
51
- test('enables extended thinking when thinking:true (budget < max_tokens, temperature omitted)', async () => {
52
- const getBody = mockFetchAndCapture();
53
- const client = createClient();
54
-
55
- await client.chat([{ role: 'user', content: 'hi' }], { thinking: true, maxTokens: 4096, temperature: 0.7 });
56
-
57
- const body = getBody()!;
58
- const thinking = body['thinking'] as Record<string, unknown> | undefined;
59
- expect(thinking).toBeDefined();
60
- expect(thinking!['type']).toBe('enabled');
61
- expect(thinking!['budget_tokens']).toBe(2048);
62
- expect(thinking!['budget_tokens'] as number).toBeLessThan(body['max_tokens'] as number);
63
- // The API forbids a custom temperature while thinking is on — must be omitted.
64
- expect(body['temperature']).toBeUndefined();
65
- });
66
-
67
- test('does not request thinking when flag is unset (temperature preserved)', async () => {
68
- const getBody = mockFetchAndCapture();
69
- const client = createClient();
70
-
71
- await client.chat([{ role: 'user', content: 'hi' }], { temperature: 0.5 });
72
-
73
- const body = getBody()!;
74
- expect(body['thinking']).toBeUndefined();
75
- expect(body['temperature']).toBe(0.5);
76
- });
77
-
78
- test('does not request thinking when thinking:false (overrides client config)', async () => {
79
- const getBody = mockFetchAndCapture();
80
- const client = createClient({ thinking: true });
81
-
82
- await client.chat([{ role: 'user', content: 'hi' }], { thinking: false });
83
-
84
- expect(getBody()!['thinking']).toBeUndefined();
85
- });
86
-
87
- test('per-call thinking:true overrides unset client config', async () => {
88
- const getBody = mockFetchAndCapture();
89
- const client = createClient();
90
-
91
- await client.chat([{ role: 'user', content: 'hi' }], { thinking: true });
92
-
93
- expect((getBody()!['thinking'] as Record<string, unknown>)['type']).toBe('enabled');
94
- });
95
-
96
- test('maps a thinking level to budget_tokens (high, clamped < max_tokens)', async () => {
97
- const getBody = mockFetchAndCapture();
98
- const client = createClient();
99
-
100
- await client.chat([{ role: 'user', content: 'hi' }], { thinking: 'high', maxTokens: 32000 });
101
-
102
- const thinking = getBody()!['thinking'] as Record<string, unknown>;
103
- expect(thinking['type']).toBe('enabled');
104
- expect(thinking['budget_tokens']).toBe(16384);
105
- });
106
-
107
- test('bumps max_tokens so budget_tokens stays below it when maxTokens is small', async () => {
108
- const getBody = mockFetchAndCapture();
109
- const client = createClient();
110
-
111
- await client.chat([{ role: 'user', content: 'hi' }], { thinking: 'low', maxTokens: 1024 });
112
-
113
- const body = getBody()!;
114
- const budget = (body['thinking'] as Record<string, unknown>)['budget_tokens'] as number;
115
- expect(budget).toBeGreaterThanOrEqual(1024);
116
- expect(budget).toBeLessThan(body['max_tokens'] as number);
117
- });
118
- });