@charming_groot/providers 0.1.0

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 (61) hide show
  1. package/dist/auth/auth-resolver.d.ts +9 -0
  2. package/dist/auth/auth-resolver.d.ts.map +1 -0
  3. package/dist/auth/auth-resolver.js +200 -0
  4. package/dist/auth/auth-resolver.js.map +1 -0
  5. package/dist/auth/index.d.ts +2 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +2 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/base-provider.d.ts +10 -0
  10. package/dist/base-provider.d.ts.map +1 -0
  11. package/dist/base-provider.js +8 -0
  12. package/dist/base-provider.js.map +1 -0
  13. package/dist/circuit-breaker.d.ts +42 -0
  14. package/dist/circuit-breaker.d.ts.map +1 -0
  15. package/dist/circuit-breaker.js +116 -0
  16. package/dist/circuit-breaker.js.map +1 -0
  17. package/dist/claude-provider.d.ts +15 -0
  18. package/dist/claude-provider.d.ts.map +1 -0
  19. package/dist/claude-provider.js +171 -0
  20. package/dist/claude-provider.js.map +1 -0
  21. package/dist/index.d.ts +10 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +9 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/openai-provider.d.ts +16 -0
  26. package/dist/openai-provider.d.ts.map +1 -0
  27. package/dist/openai-provider.js +196 -0
  28. package/dist/openai-provider.js.map +1 -0
  29. package/dist/provider-factory.d.ts +17 -0
  30. package/dist/provider-factory.d.ts.map +1 -0
  31. package/dist/provider-factory.js +36 -0
  32. package/dist/provider-factory.js.map +1 -0
  33. package/dist/retry-provider.d.ts +25 -0
  34. package/dist/retry-provider.d.ts.map +1 -0
  35. package/dist/retry-provider.js +92 -0
  36. package/dist/retry-provider.js.map +1 -0
  37. package/dist/thinking-parser.d.ts +28 -0
  38. package/dist/thinking-parser.d.ts.map +1 -0
  39. package/dist/thinking-parser.js +40 -0
  40. package/dist/thinking-parser.js.map +1 -0
  41. package/package.json +34 -0
  42. package/src/auth/auth-resolver.ts +261 -0
  43. package/src/auth/index.ts +1 -0
  44. package/src/base-provider.ts +28 -0
  45. package/src/circuit-breaker.ts +157 -0
  46. package/src/claude-provider.ts +215 -0
  47. package/src/index.ts +13 -0
  48. package/src/openai-provider.ts +239 -0
  49. package/src/provider-factory.ts +48 -0
  50. package/src/retry-provider.ts +135 -0
  51. package/src/thinking-parser.ts +50 -0
  52. package/tests/auth-resolver.test.ts +204 -0
  53. package/tests/circuit-breaker.test.ts +220 -0
  54. package/tests/claude-provider.test.ts +35 -0
  55. package/tests/openai-provider.test.ts +35 -0
  56. package/tests/provider-factory.test.ts +73 -0
  57. package/tests/retry-provider-new.test.ts +166 -0
  58. package/tests/retry-provider.test.ts +118 -0
  59. package/tests/thinking-parser.test.ts +73 -0
  60. package/tsconfig.json +10 -0
  61. package/vitest.config.ts +15 -0
@@ -0,0 +1,73 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { extractThinkTag, estimateThinkingMs } from '../src/thinking-parser.js';
3
+
4
+ describe('extractThinkTag', () => {
5
+ it('should extract think tag from beginning of content', () => {
6
+ const content = '<think>Let me analyze this step by step...</think>\nThe answer is 42.';
7
+ const result = extractThinkTag(content);
8
+ expect(result.thinkContent).toBe('Let me analyze this step by step...');
9
+ expect(result.cleanContent).toBe('The answer is 42.');
10
+ });
11
+
12
+ it('should handle multiline think content', () => {
13
+ const content = '<think>\nStep 1: Read the file\nStep 2: Parse the data\nStep 3: Return result\n</think>\nHere is the result.';
14
+ const result = extractThinkTag(content);
15
+ expect(result.thinkContent).toContain('Step 1');
16
+ expect(result.thinkContent).toContain('Step 3');
17
+ expect(result.cleanContent).toBe('Here is the result.');
18
+ });
19
+
20
+ it('should return undefined thinkContent when no think tags', () => {
21
+ const content = 'Just a normal response without thinking.';
22
+ const result = extractThinkTag(content);
23
+ expect(result.thinkContent).toBeUndefined();
24
+ expect(result.cleanContent).toBe(content);
25
+ });
26
+
27
+ it('should handle empty think tags', () => {
28
+ const content = '<think></think>Response here.';
29
+ const result = extractThinkTag(content);
30
+ expect(result.thinkContent).toBe('');
31
+ expect(result.cleanContent).toBe('Response here.');
32
+ });
33
+
34
+ it('should only match think tags at the beginning', () => {
35
+ const content = 'Some text <think>should not match</think> more text.';
36
+ const result = extractThinkTag(content);
37
+ expect(result.thinkContent).toBeUndefined();
38
+ expect(result.cleanContent).toBe(content);
39
+ });
40
+
41
+ it('should handle whitespace after closing tag', () => {
42
+ const content = '<think>thinking...</think> \nActual response.';
43
+ const result = extractThinkTag(content);
44
+ expect(result.thinkContent).toBe('thinking...');
45
+ expect(result.cleanContent).toBe('Actual response.');
46
+ });
47
+ });
48
+
49
+ describe('estimateThinkingMs', () => {
50
+ it('should estimate thinking time from content length', () => {
51
+ // 320 chars ≈ 80 tokens ≈ 1 second = 1000ms
52
+ const content = 'a'.repeat(320);
53
+ const ms = estimateThinkingMs(content);
54
+ expect(ms).toBe(1000);
55
+ });
56
+
57
+ it('should return small value for short thinking', () => {
58
+ const ms = estimateThinkingMs('brief thought');
59
+ expect(ms).toBeGreaterThan(0);
60
+ expect(ms).toBeLessThan(500);
61
+ });
62
+
63
+ it('should return larger value for long thinking', () => {
64
+ const longThought = 'a'.repeat(3200); // ~800 tokens ≈ 10s
65
+ const ms = estimateThinkingMs(longThought);
66
+ expect(ms).toBe(10000);
67
+ });
68
+
69
+ it('should handle empty string', () => {
70
+ const ms = estimateThinkingMs('');
71
+ expect(ms).toBe(0);
72
+ });
73
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "noUnusedLocals": false
7
+ },
8
+ "include": ["src/**/*.ts"],
9
+ "exclude": ["node_modules", "dist", "tests"]
10
+ }
@@ -0,0 +1,15 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import { resolve } from 'node:path';
3
+
4
+ export default defineConfig({
5
+ resolve: {
6
+ alias: {
7
+ '@charming_groot/core': resolve(__dirname, '../core/src/index.ts'),
8
+ },
9
+ },
10
+ test: {
11
+ globals: true,
12
+ environment: 'node',
13
+ include: ['tests/**/*.test.ts'],
14
+ },
15
+ });