@averyyy/pi-ai 0.85.1-piclient.6 → 0.85.1-piclient.7
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/dist/api/devin-stream.d.ts.map +1 -1
- package/dist/api/devin-stream.js +4 -2
- package/dist/api/devin-stream.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/qwen-token-plan.json +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devin-stream.d.ts","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"AA0BA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,2BAA2B,EAChC,KAAK,OAAO,EAEZ,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,MAAM,aAAa,CAAC;AAqBrB,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB,CAAA;CAAE,GAC/E;IACA,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAyWL,wBAAgB,WAAW,CAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,2BAA2B,CA4N7B","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\ttotalTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (promptTokens === undefined && completionTokens === undefined) return null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\ttotalTokens: (promptTokens ?? 0) + (completionTokens ?? 0),\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\toutput.usage.input = event.promptTokens ?? 0;\n\t\t\t\t\toutput.usage.output = event.completionTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheRead = event.cachedInputTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;\n\t\t\t\t\toutput.usage.totalTokens = event.totalTokens ?? output.usage.input + output.usage.output;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"devin-stream.d.ts","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"AA0BA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,2BAA2B,EAChC,KAAK,OAAO,EAEZ,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,MAAM,aAAa,CAAC;AAqBrB,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB,CAAA;CAAE,GAC/E;IACA,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AA0WL,wBAAgB,WAAW,CAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,2BAA2B,CA8N7B","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\ttotalTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (promptTokens === undefined && completionTokens === undefined) return null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\ttotalTokens:\n\t\t\t(promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cacheCreationInputTokens ?? 0),\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\toutput.usage.input = event.promptTokens ?? 0;\n\t\t\t\t\toutput.usage.output = event.completionTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheRead = event.cachedInputTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\tevent.totalTokens ??\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
|
package/dist/api/devin-stream.js
CHANGED
|
@@ -236,7 +236,7 @@ function decodeUsage(buf) {
|
|
|
236
236
|
kind: "usage",
|
|
237
237
|
promptTokens,
|
|
238
238
|
completionTokens,
|
|
239
|
-
totalTokens: (promptTokens ?? 0) + (completionTokens ?? 0),
|
|
239
|
+
totalTokens: (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cacheCreationInputTokens ?? 0),
|
|
240
240
|
cachedInputTokens,
|
|
241
241
|
cacheCreationInputTokens,
|
|
242
242
|
};
|
|
@@ -590,7 +590,9 @@ export function streamDevin(model, context, options) {
|
|
|
590
590
|
output.usage.output = event.completionTokens ?? 0;
|
|
591
591
|
output.usage.cacheRead = event.cachedInputTokens ?? 0;
|
|
592
592
|
output.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;
|
|
593
|
-
output.usage.totalTokens =
|
|
593
|
+
output.usage.totalTokens =
|
|
594
|
+
event.totalTokens ??
|
|
595
|
+
output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
|
|
594
596
|
}
|
|
595
597
|
}
|
|
596
598
|
closeText();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devin-stream.js","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\ttotalTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (promptTokens === undefined && completionTokens === undefined) return null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\ttotalTokens: (promptTokens ?? 0) + (completionTokens ?? 0),\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\toutput.usage.input = event.promptTokens ?? 0;\n\t\t\t\t\toutput.usage.output = event.completionTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheRead = event.cachedInputTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;\n\t\t\t\t\toutput.usage.totalTokens = event.totalTokens ?? output.usage.input + output.usage.output;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"devin-stream.js","sourceRoot":"","sources":["../../src/api/devin-stream.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nMIT License\n\nCopyright (c) 2026 Kashyab Ambarani\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nimport { randomUUID } from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"../index.ts\";\nimport { type ChatHistoryItem, type ContentPart, mapContextToChat, type ToolDef } from \"./devin-context-map.ts\";\nimport { mintUserJwt } from \"./devin-jwt.ts\";\nimport { buildMetadata } from \"./devin-metadata.ts\";\n\nimport { type ChatThinking, packThinkingSignature, unpackThinkingSignature } from \"./devin-thinking.ts\";\nimport {\n\tencodeFixed64Field,\n\tencodeMessage,\n\tencodeString,\n\tencodeVarintField,\n\tframeConnectStream,\n\titerFields,\n} from \"./devin-wire.ts\";\n\nconst SOURCE_BY_ROLE: Record<string, number> = {\n\tuser: 1,\n\tassistant: 2,\n\ttool: 4,\n};\n\nexport type CloudChatEvent =\n\t| { kind: \"text\"; text: string }\n\t| { kind: \"reasoning\"; text: string }\n\t| { kind: \"reasoning_signature\"; signature: string; signatureType?: string }\n\t| { kind: \"reasoning_redacted\" }\n\t| { kind: \"tool_call_start\"; id: string; name: string }\n\t| { kind: \"tool_call_args\"; argsDelta: string; id?: string }\n\t| { kind: \"finish\"; reason: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\" }\n\t| {\n\t\t\tkind: \"usage\";\n\t\t\tpromptTokens?: number;\n\t\t\tcompletionTokens?: number;\n\t\t\ttotalTokens?: number;\n\t\t\tcachedInputTokens?: number;\n\t\t\tcacheCreationInputTokens?: number;\n\t };\n\nfunction normalizeContent(content: string | ContentPart[]): ContentPart[] {\n\tif (typeof content === \"string\") return [{ type: \"text\", text: content }];\n\treturn content;\n}\n\nfunction encodeImageData(img: { mimeType?: string; base64Data?: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, img.base64Data ?? \"\"), encodeString(2, img.mimeType ?? \"image/png\")]);\n}\n\nfunction encodeChatToolCall(tc: { id: string; name: string; arguments: string }): Buffer {\n\treturn Buffer.concat([encodeString(1, tc.id), encodeString(2, tc.name), encodeString(3, tc.arguments)]);\n}\n\nfunction encodeChatMessagePrompt(\n\tcontent: ContentPart[],\n\tsource: number,\n\topts?: {\n\t\ttoolCallId?: string;\n\t\ttoolCalls?: Array<{ id: string; name: string; arguments: string }>;\n\t\tthinking?: ChatThinking;\n\t},\n): Buffer {\n\tconst text = content\n\t\t.filter((part) => part.type === \"text\")\n\t\t.map((part) => part.text ?? \"\")\n\t\t.join(\"\\n\");\n\tconst parts: Buffer[] = [encodeVarintField(2, source), encodeString(3, text), encodeVarintField(5, 1)];\n\tif (opts?.toolCallId) parts.push(encodeString(7, opts.toolCallId));\n\tfor (const tc of opts?.toolCalls ?? []) parts.push(encodeMessage(6, encodeChatToolCall(tc)));\n\tfor (const img of content.filter((part) => part.type === \"image\")) {\n\t\tparts.push(encodeMessage(10, encodeImageData(img)));\n\t}\n\t// 11 thinking / 12 signature / 13 thinking_redacted / 18 signature_type — the\n\t// same quartet the Devin CLI replays so the model keeps its own reasoning.\n\tif (opts?.thinking) {\n\t\tparts.push(encodeString(11, opts.thinking.text));\n\t\tparts.push(encodeString(12, opts.thinking.signature));\n\t\tif (opts.thinking.redacted) parts.push(encodeVarintField(13, 1));\n\t\tif (opts.thinking.signatureType) parts.push(encodeString(18, opts.thinking.signatureType));\n\t}\n\treturn Buffer.concat(parts);\n}\n\n/** Mirrors the Devin CLI: num_completions / max_tokens / max_newlines plus\n * temperature / top_k / top_p, and nothing else. */\nfunction encodeCompletionConfiguration(maxOutputTokens?: number, temperature?: number): Buffer {\n\treturn Buffer.concat([\n\t\tencodeVarintField(1, 1),\n\t\tencodeVarintField(2, maxOutputTokens ?? 128_000),\n\t\tencodeVarintField(3, 400),\n\t\tencodeFixed64Field(5, temperature ?? 1.0),\n\t\tencodeVarintField(7, 40),\n\t\tencodeFixed64Field(8, 0.95),\n\t]);\n}\n\n/** CortexTrajectoryReference: cascade trajectory, user-input step. */\nfunction encodeTrajectoryReference(trajectoryId: string): Buffer {\n\treturn Buffer.concat([encodeString(1, trajectoryId), encodeVarintField(3, 4), encodeVarintField(4, 14)]);\n}\n\nfunction encodeToolDef(tool: ToolDef): Buffer {\n\tconst description = tool.description;\n\treturn Buffer.concat([\n\t\tencodeString(1, tool.name),\n\t\tencodeString(2, description),\n\t\tencodeString(3, JSON.stringify(tool.parameters ?? {})),\n\t]);\n}\n\nfunction buildGetChatMessageRequest(args: {\n\tapiKey: string;\n\tuserJwt: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tcascadeId: string;\n\ttrajectoryId: string;\n\tsessionId: string;\n\trequestId: bigint;\n\ttriggerId: string;\n\tmaxOutputTokens?: number;\n\ttemperature?: number;\n}): Buffer {\n\tconst metadata = buildMetadata({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt: args.userJwt,\n\t\tsessionId: args.sessionId,\n\t\trequestId: args.requestId,\n\t\ttriggerId: args.triggerId,\n\t});\n\tconst prompts = args.messages.map((message) =>\n\t\tencodeMessage(\n\t\t\t3,\n\t\t\tencodeChatMessagePrompt(normalizeContent(message.content), SOURCE_BY_ROLE[message.role], {\n\t\t\t\ttoolCallId: message.role === \"tool\" ? message.tool_call_id : undefined,\n\t\t\t\ttoolCalls: message.role === \"assistant\" ? message.tool_calls : undefined,\n\t\t\t\tthinking: message.role === \"assistant\" ? message.thinking : undefined,\n\t\t\t}),\n\t\t),\n\t);\n\treturn Buffer.concat([\n\t\tencodeMessage(1, metadata),\n\t\t// 2 prompt — the server's system slot, same place the Devin CLI puts its own\n\t\t// system prompt. Collapsing it into the first user turn is not equivalent.\n\t\t...(args.systemPrompt ? [encodeString(2, args.systemPrompt)] : []),\n\t\t...prompts,\n\t\tencodeVarintField(7, 5),\n\t\tencodeMessage(8, encodeCompletionConfiguration(args.maxOutputTokens, args.temperature)),\n\t\t...(args.tools ?? []).map((tool) => encodeMessage(10, encodeToolDef(tool))),\n\t\tencodeMessage(15, encodeTrajectoryReference(args.trajectoryId)),\n\t\tencodeString(16, args.cascadeId),\n\t\tencodeVarintField(20, 1),\n\t\tencodeString(21, args.modelUid),\n\t]);\n}\n\nfunction* decodeChatFrame(proto: Buffer): Generator<CloudChatEvent> {\n\tlet signature: string | undefined;\n\tlet signatureType: string | undefined;\n\tfor (const field of iterFields(proto)) {\n\t\tif (field.num === 3 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"text\", text };\n\t\t} else if (field.num === 9 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) yield { kind: \"reasoning\", text };\n\t\t} else if (field.num === 11 && field.wire === 0) {\n\t\t\t// GetChatMessageResponse.thinking_redacted\n\t\t\tif (Number(field.value) !== 0) yield { kind: \"reasoning_redacted\" };\n\t\t} else if (field.num === 10 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signature = text;\n\t\t} else if (field.num === 21 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst text = field.value.toString(\"utf8\");\n\t\t\tif (text) signatureType = text;\n\t\t} else if (field.num === 6 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tlet id: string | undefined;\n\t\t\tlet name: string | undefined;\n\t\t\tlet argsDelta: string | undefined;\n\t\t\tfor (const inner of iterFields(field.value)) {\n\t\t\t\tif (inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\t\tconst text = inner.value.toString(\"utf8\");\n\t\t\t\t\tif (inner.num === 1) id = text;\n\t\t\t\t\telse if (inner.num === 2) name = text;\n\t\t\t\t\telse if (inner.num === 3) argsDelta = text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (id !== undefined && name !== undefined) yield { kind: \"tool_call_start\", id, name };\n\t\t\tif (argsDelta !== undefined) yield { kind: \"tool_call_args\", argsDelta, ...(id ? { id } : {}) };\n\t\t} else if (field.num === 5 && field.wire === 0) {\n\t\t\tconst value = Number(field.value);\n\t\t\tlet reason: Extract<CloudChatEvent, { kind: \"finish\" }>[\"reason\"] = \"stop\";\n\t\t\tif (value === 10) reason = \"tool_calls\";\n\t\t\telse if (value === 11) reason = \"content_filter\";\n\t\t\telse if ([1, 3, 5, 9].includes(value)) reason = \"length\";\n\t\t\telse if (![0, 2, 4, 6, 8, 12].includes(value)) throw new Error(`Devin returned failure stop reason ${value}`);\n\t\t\tyield { kind: \"finish\", reason };\n\t\t} else if (field.num === 28 && field.wire === 2 && Buffer.isBuffer(field.value)) {\n\t\t\tconst usage = decodeUsage(field.value);\n\t\t\tif (usage) yield usage;\n\t\t}\n\t}\n\t// The signature trails the thinking text, so it is yielded once the frame is\n\t// fully read and gets attached to the block that is already closed.\n\tif (signature !== undefined || signatureType !== undefined)\n\t\tyield { kind: \"reasoning_signature\", signature: signature ?? \"\", signatureType };\n}\n\nfunction decodeUsage(buf: Buffer): CloudChatEvent | null {\n\tlet promptTokens: number | undefined;\n\tlet completionTokens: number | undefined;\n\tlet cachedInputTokens: number | undefined;\n\tlet cacheCreationInputTokens: number | undefined;\n\tfor (const field of iterFields(buf)) {\n\t\tif (field.num !== 2 || field.wire !== 2 || !Buffer.isBuffer(field.value)) continue;\n\t\tlet metric: string | undefined;\n\t\tlet value: number | undefined;\n\t\tfor (const inner of iterFields(field.value)) {\n\t\t\tif (inner.num === 5 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tmetric = inner.value.toString(\"utf8\");\n\t\t\t} else if (inner.num === 4 && inner.wire === 2 && Buffer.isBuffer(inner.value)) {\n\t\t\t\tfor (const dim of iterFields(inner.value)) {\n\t\t\t\t\tif (dim.num === 2 && dim.wire === 5 && Buffer.isBuffer(dim.value)) {\n\t\t\t\t\t\tvalue = dim.value.readFloatLE(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!metric || value === undefined || !Number.isFinite(value)) continue;\n\t\tconst n = Math.round(value);\n\t\tif (metric === \"input_tokens\") promptTokens = n;\n\t\telse if (metric === \"output_tokens\") completionTokens = n;\n\t\telse if (metric === \"cache_read_input_tokens\") cachedInputTokens = n;\n\t\telse if (metric === \"cache_creation_input_tokens\") cacheCreationInputTokens = n;\n\t}\n\tif (promptTokens === undefined && completionTokens === undefined) return null;\n\treturn {\n\t\tkind: \"usage\",\n\t\tpromptTokens,\n\t\tcompletionTokens,\n\t\ttotalTokens:\n\t\t\t(promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cacheCreationInputTokens ?? 0),\n\t\tcachedInputTokens,\n\t\tcacheCreationInputTokens,\n\t};\n}\n\nasync function* streamChatEvents(args: {\n\tapiKey: string;\n\thost: string;\n\tmodelUid: string;\n\tsystemPrompt?: string;\n\tmessages: ChatHistoryItem[];\n\ttools?: ToolDef[];\n\tmaxOutputTokens?: number;\n\tsignal?: AbortSignal;\n\tsessionId?: string;\n\tfetchImpl: typeof fetch;\n\ttemperature?: number;\n}): AsyncGenerator<CloudChatEvent> {\n\tconst host = args.host.replace(/\\/$/, \"\");\n\tconst userJwt = await mintUserJwt(args.apiKey, host, args.signal, args.fetchImpl);\n\tconst sessionId = args.sessionId ?? randomUUID();\n\tconst ids = { sessionId, cascadeId: sessionId, trajectoryId: sessionId };\n\tconst proto = buildGetChatMessageRequest({\n\t\tapiKey: args.apiKey,\n\t\tuserJwt,\n\t\tmodelUid: args.modelUid,\n\t\tsystemPrompt: args.systemPrompt,\n\t\tmessages: args.messages,\n\t\ttools: args.tools,\n\t\tcascadeId: ids.cascadeId,\n\t\ttrajectoryId: ids.trajectoryId,\n\t\tsessionId: ids.sessionId,\n\t\trequestId: BigInt(Date.now()),\n\t\ttriggerId: randomUUID(),\n\t\tmaxOutputTokens: args.maxOutputTokens,\n\t\ttemperature: args.temperature,\n\t});\n\n\tconst resp = await args.fetchImpl(`${host}/exa.api_server_pb.ApiServerService/GetChatMessage`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/connect+proto\",\n\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\"Connect-Content-Encoding\": \"gzip\",\n\t\t\t\"Connect-Accept-Encoding\": \"gzip\",\n\t\t},\n\t\tbody: new Uint8Array(frameConnectStream(proto, true)),\n\t\tsignal: args.signal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Devin GetChatMessage failed (HTTP ${resp.status})`);\n\t}\n\tif (!resp.body) throw new Error(\"GetChatMessage returned an empty body\");\n\n\tconst reader = resp.body.getReader();\n\t// reader.closed rejects with the stream's storedError when the socket dies\n\t// mid-response; nothing awaits it -> unhandledRejection crashes the process.\n\tvoid reader.closed.catch(() => {});\n\tconst queue: Buffer[] = [];\n\tlet queued = 0;\n\tlet sawEos = false;\n\tlet trailerError: string | null = null;\n\n\tconst peek = (n: number): Buffer | null => {\n\t\tif (queued < n) return null;\n\t\tif (queue.length === 1 && queue[0].length >= n) return queue[0].subarray(0, n);\n\t\tconst parts: Buffer[] = [];\n\t\tlet remaining = n;\n\t\tfor (const chunk of queue) {\n\t\t\tif (remaining <= 0) break;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tparts.push(chunk);\n\t\t\t\tremaining -= chunk.length;\n\t\t\t} else {\n\t\t\t\tparts.push(chunk.subarray(0, remaining));\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t\treturn Buffer.concat(parts, n);\n\t};\n\n\tconst drop = (n: number): void => {\n\t\tqueued -= n;\n\t\tlet remaining = n;\n\t\twhile (remaining > 0 && queue.length > 0) {\n\t\t\tconst head = queue[0];\n\t\t\tif (head.length <= remaining) {\n\t\t\t\tqueue.shift();\n\t\t\t\tremaining -= head.length;\n\t\t\t} else {\n\t\t\t\tqueue[0] = head.subarray(remaining);\n\t\t\t\tremaining = 0;\n\t\t\t}\n\t\t}\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tif (value) {\n\t\t\t\tqueue.push(Buffer.from(value));\n\t\t\t\tqueued += value.length;\n\t\t\t}\n\t\t\twhile (queued >= 5) {\n\t\t\t\tconst header = peek(5);\n\t\t\t\tif (!header) break;\n\t\t\t\tconst flags = header[0];\n\t\t\t\tconst len = header.readUInt32BE(1);\n\t\t\t\tif (flags & ~3) throw new Error(\"Invalid Devin Connect frame flags\");\n\t\t\t\tif (len > 16 * 1024 * 1024) throw new Error(\"Devin Connect frame exceeds 16 MiB\");\n\t\t\t\tif (queued < 5 + len) break;\n\t\t\t\tdrop(5);\n\t\t\t\tconst raw = peek(len) ?? Buffer.alloc(0);\n\t\t\t\tdrop(len);\n\t\t\t\tlet payload = raw;\n\t\t\t\tif (flags & 0x01) payload = zlib.gunzipSync(raw, { maxOutputLength: 16 * 1024 * 1024 });\n\t\t\t\tif (sawEos) throw new Error(\"Devin returned data after its EOS trailer\");\n\t\t\t\tif (flags & 0x02) {\n\t\t\t\t\tsawEos = true;\n\t\t\t\t\tconst parsed = JSON.parse(payload.toString(\"utf8\")) as { error?: { code?: string; message?: string } };\n\t\t\t\t\tif (parsed.error) {\n\t\t\t\t\t\tconst detail =\n\t\t\t\t\t\t\ttypeof parsed.error.message === \"string\"\n\t\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t\t\t\t.replaceAll(args.apiKey, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.replaceAll(userJwt, \"[redacted]\")\n\t\t\t\t\t\t\t\t\t\t.slice(0, 500)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\ttrailerError = `Devin stream failed (${parsed.error.code ?? \"unknown\"})${detail ? `: ${detail}` : \"\"}`;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tyield* decodeChatFrame(payload);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t\ttry {\n\t\t\t// await: on an errored stream cancel() returns a rejected promise;\n\t\t\t// `void`-ing it escapes the try/catch as an unhandled rejection.\n\t\t\tawait resp.body?.cancel();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tif (trailerError) throw new Error(trailerError);\n\tif (queued) throw new Error(\"Truncated Devin Connect frame\");\n\tif (!sawEos) throw new Error(\"Devin stream ended without an EOS trailer\");\n}\n\nexport function streamDevin(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet textOpen = false;\n\t\tlet thinkingOpen = false;\n\t\tlet thinkingIndex = -1;\n\t\tlet toolId = \"\";\n\t\tconst toolStates = new Map<string, { index: number; json: string }>();\n\n\t\tconst closeText = () => {\n\t\t\tif (!textOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tstream.push({ type: \"text_end\", contentIndex: idx, content: block.text, partial: output });\n\t\t\t}\n\t\t\ttextOpen = false;\n\t\t};\n\t\tconst closeThinking = () => {\n\t\t\tif (!thinkingOpen) return;\n\t\t\tconst idx = output.content.length - 1;\n\t\t\tconst block = output.content[idx];\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\tstream.push({ type: \"thinking_end\", contentIndex: idx, content: block.thinking, partial: output });\n\t\t\t}\n\t\t\tthinkingOpen = false;\n\t\t};\n\t\tconst closeTool = () => {\n\t\t\tfor (const state of toolStates.values()) {\n\t\t\t\tconst block = output.content[state.index];\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst parsed: unknown = JSON.parse(state.json);\n\t\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\t\t\t\t\tthrow new Error(\"Invalid Devin tool arguments\");\n\t\t\t\t\tblock.arguments = parsed as Record<string, unknown>;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoolStates.clear();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\")\n\t\t\t\tthrow new Error(\"Devin inference must use pi-server in PI_SERVER_MODE\");\n\t\t\tif (!apiKey) throw new Error(\"No Devin credentials. Run /login devin.\");\n\t\t\tconst host = model.baseUrl.replace(/\\/$/, \"\");\n\t\t\tif (options?.reasoning && model.thinkingLevelMap && model.thinkingLevelMap[options.reasoning] !== model.id)\n\t\t\t\tthrow new Error(\"Select the Devin model variant for the requested reasoning effort\");\n\t\t\tif (options?.onPayload) throw new Error(\"Devin does not support onPayload overrides\");\n\t\t\tconst modelUid = model.id;\n\t\t\tconst mapped = mapContextToChat(context, model.id);\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tfor await (const event of streamChatEvents({\n\t\t\t\tapiKey,\n\t\t\t\thost,\n\t\t\t\tmodelUid,\n\t\t\t\tsystemPrompt: mapped.systemPrompt,\n\t\t\t\tmessages: mapped.messages,\n\t\t\t\ttools: mapped.tools.length > 0 ? mapped.tools : undefined,\n\t\t\t\tmaxOutputTokens: options?.maxTokens ?? model.maxTokens,\n\t\t\t\tsignal: options?.signal\n\t\t\t\t\t? AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs ?? 600_000)])\n\t\t\t\t\t: AbortSignal.timeout(options?.timeoutMs ?? 600_000),\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\tfetchImpl: options?.fetch ?? fetch,\n\t\t\t\ttemperature: options?.temperature,\n\t\t\t})) {\n\t\t\t\tif (event.kind === \"text\") {\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\tif (!textOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\ttextOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.text;\n\t\t\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tif (!thinkingOpen) {\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = output.content.length - 1;\n\t\t\t\t\tconst block = output.content[idx];\n\t\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.text;\n\t\t\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta: event.text, partial: output });\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_signature\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = output.content[thinkingIndex];\n\t\t\t\t\tif (block?.type === \"thinking\") {\n\t\t\t\t\t\tconst previous = unpackThinkingSignature(block.thinkingSignature);\n\t\t\t\t\t\tblock.thinkingSignature = packThinkingSignature(\n\t\t\t\t\t\t\t(previous.signature ?? \"\") + event.signature,\n\t\t\t\t\t\t\tevent.signatureType ?? previous.signatureType,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.kind === \"reasoning_redacted\") {\n\t\t\t\t\tif (thinkingIndex < 0) {\n\t\t\t\t\t\tcloseText();\n\t\t\t\t\t\toutput.content.push({ type: \"thinking\", thinking: \"\" });\n\t\t\t\t\t\tthinkingIndex = output.content.length - 1;\n\t\t\t\t\t\tthinkingOpen = true;\n\t\t\t\t\t\tstream.push({ type: \"thinking_start\", contentIndex: thinkingIndex, partial: output });\n\t\t\t\t\t}\n\t\t\t\t\tconst block = thinkingIndex >= 0 ? output.content[thinkingIndex] : undefined;\n\t\t\t\t\tif (block?.type === \"thinking\") block.redacted = true;\n\t\t\t\t} else if (event.kind === \"tool_call_start\") {\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\ttoolId = event.id;\n\t\t\t\t\tconst existing = toolStates.get(toolId);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tconst block = output.content[existing.index];\n\t\t\t\t\t\tif (block.type !== \"toolCall\" || block.name !== event.name)\n\t\t\t\t\t\t\tthrow new Error(\"Devin changed a tool call's name\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!toolId || !event.name) throw new Error(\"Devin returned an empty tool identity\");\n\t\t\t\t\toutput.content.push({ type: \"toolCall\", id: event.id, name: event.name, arguments: {} });\n\t\t\t\t\tconst toolIndex = output.content.length - 1;\n\t\t\t\t\ttoolStates.set(toolId, { index: toolIndex, json: \"\" });\n\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: toolIndex, partial: output });\n\t\t\t\t} else if (event.kind === \"tool_call_args\") {\n\t\t\t\t\tconst state = toolStates.get(event.id ?? toolId);\n\t\t\t\t\tif (!state) throw new Error(\"Devin tool argument delta has no matching call\");\n\t\t\t\t\tstate.json += event.argsDelta;\n\t\t\t\t\tconst block = output.content[state.index];\n\t\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tblock.arguments = JSON.parse(state.json);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// incomplete json\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\t\tcontentIndex: state.index,\n\t\t\t\t\t\tdelta: event.argsDelta,\n\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.kind === \"finish\") {\n\t\t\t\t\tif (event.reason === \"content_filter\")\n\t\t\t\t\t\tthrow new Error(\"Devin response was blocked by content filtering\");\n\t\t\t\t\tcloseText();\n\t\t\t\t\tcloseThinking();\n\t\t\t\t\toutput.stopReason =\n\t\t\t\t\t\tevent.reason === \"tool_calls\" ? \"toolUse\" : event.reason === \"length\" ? \"length\" : \"stop\";\n\t\t\t\t} else if (event.kind === \"usage\") {\n\t\t\t\t\toutput.usage.input = event.promptTokens ?? 0;\n\t\t\t\t\toutput.usage.output = event.completionTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheRead = event.cachedInputTokens ?? 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.cacheCreationInputTokens ?? 0;\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\tevent.totalTokens ??\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseText();\n\t\t\tcloseThinking();\n\t\t\tcloseTool();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (!output.content.length) throw new Error(\"Devin returned an empty completion\");\n\t\t\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const) {\n\t\t\t\toutput.usage.cost[key] = (output.usage[key] * model.cost[key]) / 1_000_000;\n\t\t\t}\n\t\t\toutput.usage.cost.total =\n\t\t\t\toutput.usage.cost.input +\n\t\t\t\toutput.usage.cost.output +\n\t\t\t\toutput.usage.cost.cacheRead +\n\t\t\t\toutput.usage.cost.cacheWrite;\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason as \"stop\" | \"length\" | \"toolUse\", message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason as \"aborted\" | \"error\", error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"schemaVersion":3,"generatedAt":"2026-09-
|
|
1
|
+
{"schemaVersion":3,"generatedAt":"2026-09-16T01:52:51.772Z","structureHash":"4fdb275b14dde95f461ae68e7790c8a557263f228e3f431a68ff9a7ccb0af450","files":{"amazon-bedrock.json":"843ede349a0435b8a4228733dfde8cff3baea7c134cb46fe7409ceef1b424f9c","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"c0e1cfcef8531b5d0852c0e74790290f130dbcb4591b6578bb0d8a4b464231c0","azure-openai-responses.json":"2f42741e47dbebd8491cf40bff1de313fc2221f55e16bc02fd6e5d50b5f8fefe","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","cloudflare-ai-gateway.json":"eb2bf274394a157714072a2726675fbdfd2cc370e359b6665fa6aca409617089","cloudflare-workers-ai.json":"07ef63208ff7517fd1a80962f18143e21de399640423329490b157f459ccf995","deepseek.json":"8cc5e02a8eb3f1ead25da01d6ebac7dbd9aa5134c561026de2076cc990eb3349","fireworks.json":"f393e2f9d3ba8b00b39911ac7a688c96ad79b549ba8b9ec9403398e0eee75d29","github-copilot.json":"5ddbd26a51c3d60975dfc41c685f65ee0964b94352379f9f3dac77715f389004","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"a488b6f175b382277ccf7d487f877ef0c698994576bb55d2410838bf9c8c7c41","kimi-coding.json":"202d4b9a3e3327cebb01626fb1818f92627e59800f27858902c4ce69105f0bd7","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"63f77de8782dce6a8d4649b6075ee04c9732863ae85561e0867871220c558bde","moonshotai.json":"2a8dfb97eb905e991c22081dc09bd4a61c05b7fa9ac0d5c72d6930f601f490f1","nvidia.json":"7459d845fd752fb70a9be5a28be44dc5e2873fbd788e9c931d3200731db42ba9","openai-codex.json":"a10bfcfd34db6bcb98d8ee46175e154cab30530a137dbf31ac1434020ed3ffdd","openai.json":"775d3b7d95d14b741d0b287b1153d40f051a9ea03035a82b487889acc7fa69e2","opencode-go.json":"274c4fb1a4e99c286860174700b0b38997df62839efd2b76a8884db1d8dc331a","opencode.json":"7b878f5fb48e9fce68af0c3b507ddafd88a07b5ec7a8c06e9b99cf85b27324ac","openrouter.json":"c0548c18afe6f3dcc687a04e1f9508f285660238620fdd8208ce4498e64e7dd5","qwen-token-plan-cn.json":"f8f100c10968e3abcf444964452a5738d8408f08d0b18859187a034d3e573b00","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"f5dad46166a7c55fc7b6161cfb477c282d3f64fa301d3f472cc47f6a7e4889ec","together.json":"927c707d06f2236cdab13f14c870fb58bce0614ba7287bbcd57cc9fd66d191ed","vercel-ai-gateway.json":"757a80635ca95df93867b5993c181e9128a3f2e039c8831a7fde69f6b3fff171","xai.json":"037bde3de5ea72814c3f0b79da8b244c89feb708cc0cbf8596cdfac7682477b6","xiaomi-token-plan-ams.json":"a36446cb9e3cb4f7054617676fd711092245a74f703ba89573f21d2673b85fa8","xiaomi-token-plan-cn.json":"c295dadf4097b5d86af15e924fb2a1a6342bae9e0a9a5839c9fca216308c51e5","xiaomi-token-plan-sgp.json":"93d359575c2348c97d79a2b14e1e9437199bd4aee948d58611b3fbab75cd9fb3","xiaomi.json":"f06f1011d606d22311b1f4c50eb36d38b8cd99abf5760faee657d5559e87452b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}}
|