@things-factory/ai-client-base 10.1.129 → 10.1.155

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 (76) hide show
  1. package/config/config.development.js +2 -68
  2. package/config/config.production.js +2 -20
  3. package/dist-server/service/agent/agent-directory.d.ts +71 -0
  4. package/dist-server/service/agent/agent-directory.js +129 -0
  5. package/dist-server/service/agent/agent-directory.js.map +1 -0
  6. package/dist-server/service/agent/agent-settings-save.d.ts +38 -0
  7. package/dist-server/service/agent/agent-settings-save.js +153 -0
  8. package/dist-server/service/agent/agent-settings-save.js.map +1 -0
  9. package/dist-server/service/agent/agent-spec.d.ts +43 -0
  10. package/dist-server/service/agent/agent-spec.js +83 -0
  11. package/dist-server/service/agent/agent-spec.js.map +1 -0
  12. package/dist-server/service/agent/ai-client-for.d.ts +53 -0
  13. package/dist-server/service/agent/ai-client-for.js +166 -0
  14. package/dist-server/service/agent/ai-client-for.js.map +1 -0
  15. package/dist-server/service/agent/ai-usage-summary.d.ts +37 -0
  16. package/dist-server/service/agent/ai-usage-summary.js +108 -0
  17. package/dist-server/service/agent/ai-usage-summary.js.map +1 -0
  18. package/dist-server/service/agent/ai-usage.d.ts +35 -0
  19. package/dist-server/service/agent/ai-usage.js +118 -0
  20. package/dist-server/service/agent/ai-usage.js.map +1 -0
  21. package/dist-server/service/agent/index.d.ts +7 -0
  22. package/dist-server/service/agent/index.js +13 -0
  23. package/dist-server/service/agent/index.js.map +1 -0
  24. package/dist-server/service/agent/provider-models.d.ts +12 -0
  25. package/dist-server/service/agent/provider-models.js +37 -0
  26. package/dist-server/service/agent/provider-models.js.map +1 -0
  27. package/dist-server/service/capability.d.ts +21 -10
  28. package/dist-server/service/capability.js +20 -49
  29. package/dist-server/service/capability.js.map +1 -1
  30. package/dist-server/service/factory.d.ts +7 -12
  31. package/dist-server/service/factory.js +0 -45
  32. package/dist-server/service/factory.js.map +1 -1
  33. package/dist-server/service/index.d.ts +3 -0
  34. package/dist-server/service/index.js +6 -1
  35. package/dist-server/service/index.js.map +1 -1
  36. package/dist-server/service/providers/anthropic.d.ts +2 -0
  37. package/dist-server/service/providers/anthropic.js +16 -0
  38. package/dist-server/service/providers/anthropic.js.map +1 -1
  39. package/dist-server/service/providers/gemini.d.ts +13 -0
  40. package/dist-server/service/providers/gemini.js +52 -12
  41. package/dist-server/service/providers/gemini.js.map +1 -1
  42. package/dist-server/service/providers/openai.d.ts +6 -0
  43. package/dist-server/service/providers/openai.js +34 -8
  44. package/dist-server/service/providers/openai.js.map +1 -1
  45. package/dist-server/service/types.d.ts +16 -2
  46. package/dist-server/service/types.js.map +1 -1
  47. package/dist-server/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +6 -3
  49. package/server/service/agent/agent-directory.test.ts +206 -0
  50. package/server/service/agent/agent-directory.ts +198 -0
  51. package/server/service/agent/agent-settings-save.test.ts +151 -0
  52. package/server/service/agent/agent-settings-save.ts +205 -0
  53. package/server/service/agent/agent-spec.ts +103 -0
  54. package/server/service/agent/ai-client-for.test.ts +141 -0
  55. package/server/service/agent/ai-client-for.ts +201 -0
  56. package/server/service/agent/ai-usage-summary.test.ts +65 -0
  57. package/server/service/agent/ai-usage-summary.ts +146 -0
  58. package/server/service/agent/ai-usage.ts +97 -0
  59. package/server/service/agent/index.ts +7 -0
  60. package/server/service/agent/one-door.test.ts +57 -0
  61. package/server/service/agent/provider-models.ts +43 -0
  62. package/server/service/capability.test.ts +26 -55
  63. package/server/service/capability.ts +25 -42
  64. package/server/service/factory.ts +4 -44
  65. package/server/service/index.ts +6 -1
  66. package/server/service/providers/anthropic.ts +17 -0
  67. package/server/service/providers/gemini.ts +54 -12
  68. package/server/service/providers/openai-models.test.ts +30 -0
  69. package/server/service/providers/openai.ts +34 -8
  70. package/server/service/types.ts +18 -2
  71. package/translations/en.json +13 -0
  72. package/translations/es.json +13 -0
  73. package/translations/ja.json +13 -0
  74. package/translations/ko.json +13 -0
  75. package/translations/ms.json +13 -0
  76. package/translations/zh.json +13 -0
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../server/service/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG","sourcesContent":["/**\n * Provider-agnostic AI client types.\n *\n * 공통 인터페이스만 정의 — 실제 호출은 provider 별 어댑터에서.\n */\n\nexport type AIRole = 'system' | 'user' | 'assistant'\n\nexport interface AITextPart {\n type: 'text'\n text: string\n}\n\nexport type AIImageMediaType = 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp'\n\nexport interface AIImagePart {\n type: 'image'\n source:\n | { kind: 'base64'; data: Buffer | Uint8Array; mediaType: AIImageMediaType }\n | { kind: 'url'; url: string }\n}\n\n/**\n * Assistant 가 tool 을 호출하라고 한 시점의 content part.\n * 다음 턴에서 같은 id 로 tool_result 를 매핑한다.\n */\nexport interface AIToolUsePart {\n type: 'tool_use'\n /** provider-stable id — Anthropic tool_use.id / OpenAI tool_call.id / Gemini 의 자체 매핑 */\n id: string\n /** tool 이름 */\n name: string\n /** 호출 인자 (JSON object) */\n arguments: Record<string, any>\n /**\n * provider-specific opaque metadata that must be echoed back when this tool_use\n * is referenced in subsequent turns.\n *\n * Gemini: `thoughtSignature` — 안 보내면 400 에러.\n * Anthropic: 없음.\n * OpenAI: 없음.\n *\n * 호출자(assistant loop)는 AIToolCall.providerMeta 를 그대로 복사해 넣는다.\n */\n providerMeta?: Record<string, any>\n}\n\n/**\n * 도구 실행 결과를 LLM 에 회신하는 user 측 content part.\n *\n * Anthropic: { type: 'tool_result', tool_use_id, content } — user role 에 들어감.\n * OpenAI: tool role 메시지로 전송.\n * Gemini: functionResponse part — user role 에 들어감.\n */\nexport interface AIToolResultPart {\n type: 'tool_result'\n /** 매핑되는 AIToolUsePart.id */\n toolUseId: string\n /** 도구 실행 결과 (text 또는 JSON-serializable) */\n content: string\n /** 실행 중 에러 발생 표시 (LLM 이 retry/대안 판단) */\n isError?: boolean\n}\n\nexport type AIContentPart = AITextPart | AIImagePart | AIToolUsePart | AIToolResultPart\n\nexport interface AIMessage {\n role: AIRole\n content: string | AIContentPart[]\n}\n\nexport interface AIChatOptions {\n /** 모델 override (없으면 client 기본값) */\n model?: string\n maxTokens?: number\n temperature?: number\n /**\n * system prompt — messages 의 system 메시지와 합쳐서 전달.\n * Anthropic 의 system 파라미터 / OpenAI 의 system 메시지로 매핑.\n */\n systemPrompt?: string\n stopSequences?: string[]\n}\n\nexport interface AIJSONOptions extends AIChatOptions {\n /** JSON Schema (옵션). 어댑터가 지원하면 structured output 강제 */\n schema?: object\n}\n\nexport interface AIVisionOptions extends AIChatOptions {}\n\n// ── Tool calling ──────────────────────────────────────────────────\n\n/**\n * Provider-agnostic 도구 정의.\n * Anthropic input_schema / OpenAI parameters / Gemini parameters 로 어댑터에서 정규화.\n */\nexport interface AITool {\n name: string\n description: string\n /** JSON Schema (object 권장). enum / required / properties 등 표준 키 사용. */\n parameters: Record<string, any>\n}\n\n/**\n * LLM 이 호출하라고 지시한 도구 1 건.\n * id 는 multi-turn 흐름에서 tool_result 매핑에 사용 — 어댑터가 항상 채워야 한다.\n */\nexport interface AIToolCall {\n id: string\n name: string\n arguments: Record<string, any>\n /**\n * provider-specific opaque metadata to round-trip on subsequent turns.\n * Gemini 는 `thoughtSignature` 를 여기에 담는다 — 다음 턴에 functionCall.thoughtSignature\n * 로 복원되어야 400 에러 회피.\n */\n providerMeta?: Record<string, any>\n}\n\nexport interface AIToolChatOptions extends AIChatOptions {\n /**\n * tool 선택 모드:\n * - 'auto': LLM 자율 (tool 호출 또는 텍스트 응답)\n * - 'required': 반드시 하나 이상 tool 호출\n * - 'none': tool 무시, 텍스트만\n */\n toolChoice?: 'auto' | 'required' | 'none'\n /** 'required' 와 함께 특정 tool 강제. provider 별 지원 다름. */\n forceTool?: string\n /**\n * 병렬 tool 호출 허용 여부 (default true).\n * false 시 LLM 이 한 번에 하나의 tool 만 호출.\n */\n allowParallelToolCalls?: boolean\n}\n\nexport interface AIToolChatResult {\n /** 사용자에게 보여줄 텍스트 (tool 호출과 함께 동봉될 수도 있음) */\n text?: string\n /** LLM 이 호출하라고 지시한 도구들 (병렬 가능) */\n toolCalls: AIToolCall[]\n /**\n * 정규화된 stop reason:\n * 'tool_use' — tool 호출 발생\n * 'end_turn' — 텍스트 응답 종료\n * 'max_tokens' — 토큰 한도\n * 'stop_sequence' — stop sequence 도달\n * 기타 — provider 원본 그대로\n */\n stopReason: 'tool_use' | 'end_turn' | 'max_tokens' | 'stop_sequence' | string\n}\n\n// ── Client ────────────────────────────────────────────────────────\n\nexport interface AIClient {\n /** 'anthropic:claude-sonnet-4-6' 등 사람이 읽을 식별자 */\n readonly id: string\n\n /** 텍스트 chat completion */\n chat(messages: AIMessage[], options?: AIChatOptions): Promise<string>\n\n /** JSON 출력 강제. 파싱된 객체 반환. */\n generateJSON<T = unknown>(prompt: string | AIMessage[], options?: AIJSONOptions): Promise<T>\n\n /** 이미지 입력 — 텍스트 응답. 어댑터가 vision 모델을 지원해야 함. */\n vision?(\n image: Buffer | Uint8Array | { url: string },\n prompt: string,\n options?: AIVisionOptions\n ): Promise<string>\n\n /**\n * Tool calling — LLM 이 자유 텍스트 대신 정의된 도구를 schema-검증된 인자로 호출.\n * 각 도구의 parameters 가 enum/required 강제 → invalid type / 누락 필드 봉쇄.\n * 어댑터별로 Anthropic tool_use / OpenAI tools / Gemini functionCalls 로 매핑.\n */\n chatWithTools?(\n messages: AIMessage[],\n tools: AITool[],\n options?: AIToolChatOptions\n ): Promise<AIToolChatResult>\n}\n\nexport interface AIClientConfig {\n /** 등록된 provider 이름 (예: 'anthropic', 'openai', 'gemini') */\n provider: string\n /** 기본 모델 ID */\n model?: string\n apiKey?: string\n /** OpenAI organization (provider:'openai' 전용) */\n organization?: string\n baseURL?: string\n [k: string]: any\n}\n\nexport type AIProviderFactory = (config: AIClientConfig) => AIClient\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../server/service/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG","sourcesContent":["/**\n * Provider-agnostic AI client types.\n *\n * 공통 인터페이스만 정의 — 실제 호출은 provider 별 어댑터에서.\n */\n\nexport type AIRole = 'system' | 'user' | 'assistant'\n\nexport interface AITextPart {\n type: 'text'\n text: string\n}\n\nexport type AIImageMediaType = 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp'\n\nexport interface AIImagePart {\n type: 'image'\n source:\n | { kind: 'base64'; data: Buffer | Uint8Array; mediaType: AIImageMediaType }\n | { kind: 'url'; url: string }\n}\n\n/**\n * Assistant 가 tool 을 호출하라고 한 시점의 content part.\n * 다음 턴에서 같은 id 로 tool_result 를 매핑한다.\n */\nexport interface AIToolUsePart {\n type: 'tool_use'\n /** provider-stable id — Anthropic tool_use.id / OpenAI tool_call.id / Gemini 의 자체 매핑 */\n id: string\n /** tool 이름 */\n name: string\n /** 호출 인자 (JSON object) */\n arguments: Record<string, any>\n /**\n * provider-specific opaque metadata that must be echoed back when this tool_use\n * is referenced in subsequent turns.\n *\n * Gemini: `thoughtSignature` — 안 보내면 400 에러.\n * Anthropic: 없음.\n * OpenAI: 없음.\n *\n * 호출자(assistant loop)는 AIToolCall.providerMeta 를 그대로 복사해 넣는다.\n */\n providerMeta?: Record<string, any>\n}\n\n/**\n * 도구 실행 결과를 LLM 에 회신하는 user 측 content part.\n *\n * Anthropic: { type: 'tool_result', tool_use_id, content } — user role 에 들어감.\n * OpenAI: tool role 메시지로 전송.\n * Gemini: functionResponse part — user role 에 들어감.\n */\nexport interface AIToolResultPart {\n type: 'tool_result'\n /** 매핑되는 AIToolUsePart.id */\n toolUseId: string\n /** 도구 실행 결과 (text 또는 JSON-serializable) */\n content: string\n /** 실행 중 에러 발생 표시 (LLM 이 retry/대안 판단) */\n isError?: boolean\n}\n\nexport type AIContentPart = AITextPart | AIImagePart | AIToolUsePart | AIToolResultPart\n\nexport interface AIMessage {\n role: AIRole\n content: string | AIContentPart[]\n}\n\nexport interface AIChatOptions {\n /** 모델 override (없으면 client 기본값) */\n model?: string\n maxTokens?: number\n temperature?: number\n /**\n * system prompt — messages 의 system 메시지와 합쳐서 전달.\n * Anthropic 의 system 파라미터 / OpenAI 의 system 메시지로 매핑.\n */\n systemPrompt?: string\n stopSequences?: string[]\n /**\n * Told what one provider call used, right after it returns. The metering boundary (aiClientFor) sets this per\n * call so the usage row knows whose call it was; adapters call it once for every request they send.\n */\n onUsage?: (usage: AIProviderUsage) => void\n}\n\n/** What one provider request used, as the provider reported it. A count the provider did not report stays undefined. */\nexport interface AIProviderUsage {\n model: string\n inputTokens?: number\n outputTokens?: number\n}\n\nexport interface AIJSONOptions extends AIChatOptions {\n /** JSON Schema (옵션). 어댑터가 지원하면 structured output 강제 */\n schema?: object\n}\n\nexport interface AIVisionOptions extends AIChatOptions {}\n\n// ── Tool calling ──────────────────────────────────────────────────\n\n/**\n * Provider-agnostic 도구 정의.\n * Anthropic input_schema / OpenAI parameters / Gemini parameters 로 어댑터에서 정규화.\n */\nexport interface AITool {\n name: string\n description: string\n /** JSON Schema (object 권장). enum / required / properties 등 표준 키 사용. */\n parameters: Record<string, any>\n}\n\n/**\n * LLM 이 호출하라고 지시한 도구 1 건.\n * id 는 multi-turn 흐름에서 tool_result 매핑에 사용 — 어댑터가 항상 채워야 한다.\n */\nexport interface AIToolCall {\n id: string\n name: string\n arguments: Record<string, any>\n /**\n * provider-specific opaque metadata to round-trip on subsequent turns.\n * Gemini 는 `thoughtSignature` 를 여기에 담는다 — 다음 턴에 functionCall.thoughtSignature\n * 로 복원되어야 400 에러 회피.\n */\n providerMeta?: Record<string, any>\n}\n\nexport interface AIToolChatOptions extends AIChatOptions {\n /**\n * tool 선택 모드:\n * - 'auto': LLM 자율 (tool 호출 또는 텍스트 응답)\n * - 'required': 반드시 하나 이상 tool 호출\n * - 'none': tool 무시, 텍스트만\n */\n toolChoice?: 'auto' | 'required' | 'none'\n /** 'required' 와 함께 특정 tool 강제. provider 별 지원 다름. */\n forceTool?: string\n /**\n * 병렬 tool 호출 허용 여부 (default true).\n * false 시 LLM 이 한 번에 하나의 tool 만 호출.\n */\n allowParallelToolCalls?: boolean\n}\n\nexport interface AIToolChatResult {\n /** 사용자에게 보여줄 텍스트 (tool 호출과 함께 동봉될 수도 있음) */\n text?: string\n /** LLM 이 호출하라고 지시한 도구들 (병렬 가능) */\n toolCalls: AIToolCall[]\n /**\n * 정규화된 stop reason:\n * 'tool_use' — tool 호출 발생\n * 'end_turn' — 텍스트 응답 종료\n * 'max_tokens' — 토큰 한도\n * 'stop_sequence' — stop sequence 도달\n * 기타 — provider 원본 그대로\n */\n stopReason: 'tool_use' | 'end_turn' | 'max_tokens' | 'stop_sequence' | string\n}\n\n// ── Client ────────────────────────────────────────────────────────\n\nexport interface AIClient {\n /** 'anthropic:claude-sonnet-4-6' 등 사람이 읽을 식별자 */\n readonly id: string\n\n /** 텍스트 chat completion */\n chat(messages: AIMessage[], options?: AIChatOptions): Promise<string>\n\n /** JSON 출력 강제. 파싱된 객체 반환. */\n generateJSON<T = unknown>(prompt: string | AIMessage[], options?: AIJSONOptions): Promise<T>\n\n /** 이미지 입력 — 텍스트 응답. 어댑터가 vision 모델을 지원해야 함. */\n vision?(\n image: Buffer | Uint8Array | { url: string },\n prompt: string,\n options?: AIVisionOptions\n ): Promise<string>\n\n /**\n * Tool calling — LLM 이 자유 텍스트 대신 정의된 도구를 schema-검증된 인자로 호출.\n * 각 도구의 parameters 가 enum/required 강제 → invalid type / 누락 필드 봉쇄.\n * 어댑터별로 Anthropic tool_use / OpenAI tools / Gemini functionCalls 로 매핑.\n */\n chatWithTools?(\n messages: AIMessage[],\n tools: AITool[],\n options?: AIToolChatOptions\n ): Promise<AIToolChatResult>\n\n /** The ids of the conversation models this key may call, sorted. Reading it also proves the key is accepted. */\n listModels(): Promise<string[]>\n}\n\nexport interface AIClientConfig {\n /** 등록된 provider 이름 (예: 'anthropic', 'openai', 'gemini') */\n provider: string\n /** The model every call uses unless a call names another. */\n model?: string\n /** Required - a provider is never reached with a key from the process environment. */\n apiKey: string\n /** OpenAI organization (provider:'openai' 전용) */\n organization?: string\n baseURL?: string\n [k: string]: any\n}\n\nexport type AIProviderFactory = (config: AIClientConfig) => AIClient\n"]}