summaryrefslogtreecommitdiffhomepage
path: root/packages/console/app/src/routes/zen/util/provider
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-11-06 13:03:02 -0500
committerDax Raad <[email protected]>2025-11-06 13:03:12 -0500
commit1ea3a8eb9beeb7d510fd29164ea741acec1ee04d (patch)
tree22c35a0003c6c2cfb998431f8e5180879cbab9d3 /packages/console/app/src/routes/zen/util/provider
parent8729edc5e059a9a29346044b016a6e05d9aca835 (diff)
downloadopencode-1ea3a8eb9beeb7d510fd29164ea741acec1ee04d.tar.gz
opencode-1ea3a8eb9beeb7d510fd29164ea741acec1ee04d.zip
big format
Diffstat (limited to 'packages/console/app/src/routes/zen/util/provider')
-rw-r--r--packages/console/app/src/routes/zen/util/provider/anthropic.ts61
-rw-r--r--packages/console/app/src/routes/zen/util/provider/openai-compatible.ts35
-rw-r--r--packages/console/app/src/routes/zen/util/provider/openai.ts79
3 files changed, 135 insertions, 40 deletions
diff --git a/packages/console/app/src/routes/zen/util/provider/anthropic.ts b/packages/console/app/src/routes/zen/util/provider/anthropic.ts
index 603d8917b..f4e8dc44d 100644
--- a/packages/console/app/src/routes/zen/util/provider/anthropic.ts
+++ b/packages/console/app/src/routes/zen/util/provider/anthropic.ts
@@ -98,7 +98,10 @@ export function fromAnthropicRequest(body: any): CommonRequest {
typeof (src as any).media_type === "string" &&
typeof (src as any).data === "string"
)
- return { type: "image_url", image_url: { url: `data:${(src as any).media_type};base64,${(src as any).data}` } }
+ return {
+ type: "image_url",
+ image_url: { url: `data:${(src as any).media_type};base64,${(src as any).data}` },
+ }
return undefined
}
@@ -120,12 +123,15 @@ export function fromAnthropicRequest(body: any): CommonRequest {
if ((p as any).type === "tool_result") {
const id = (p as any).tool_use_id
const content =
- typeof (p as any).content === "string" ? (p as any).content : JSON.stringify((p as any).content)
+ typeof (p as any).content === "string"
+ ? (p as any).content
+ : JSON.stringify((p as any).content)
msgs.push({ role: "tool", tool_call_id: id, content })
}
}
if (partsOut.length > 0) {
- if (partsOut.length === 1 && partsOut[0].type === "text") msgs.push({ role: "user", content: partsOut[0].text })
+ if (partsOut.length === 1 && partsOut[0].type === "text")
+ msgs.push({ role: "user", content: partsOut[0].text })
else msgs.push({ role: "user", content: partsOut })
}
continue
@@ -137,7 +143,8 @@ export function fromAnthropicRequest(body: any): CommonRequest {
const tcs: any[] = []
for (const p of partsIn) {
if (!p || !(p as any).type) continue
- if ((p as any).type === "text" && typeof (p as any).text === "string") texts.push((p as any).text)
+ if ((p as any).type === "text" && typeof (p as any).text === "string")
+ texts.push((p as any).text)
if ((p as any).type === "tool_use") {
const name = (p as any).name
const id = (p as any).id
@@ -165,7 +172,11 @@ export function fromAnthropicRequest(body: any): CommonRequest {
.filter((t: any) => t && typeof t === "object" && "input_schema" in t)
.map((t: any) => ({
type: "function",
- function: { name: (t as any).name, description: (t as any).description, parameters: (t as any).input_schema },
+ function: {
+ name: (t as any).name,
+ description: (t as any).description,
+ parameters: (t as any).input_schema,
+ },
}))
: undefined
@@ -203,7 +214,9 @@ export function fromAnthropicRequest(body: any): CommonRequest {
export function toAnthropicRequest(body: CommonRequest) {
if (!body || typeof body !== "object") return body
- const sysIn = Array.isArray(body.messages) ? body.messages.filter((m: any) => m && m.role === "system") : []
+ const sysIn = Array.isArray(body.messages)
+ ? body.messages.filter((m: any) => m && m.role === "system")
+ : []
let ccCount = 0
const cc = () => {
ccCount++
@@ -354,7 +367,9 @@ export function fromAnthropicResponse(resp: any): CommonResponse {
const idIn = (resp as any).id
const id =
- typeof idIn === "string" ? idIn.replace(/^msg_/, "chatcmpl_") : `chatcmpl_${Math.random().toString(36).slice(2)}`
+ typeof idIn === "string"
+ ? idIn.replace(/^msg_/, "chatcmpl_")
+ : `chatcmpl_${Math.random().toString(36).slice(2)}`
const model = (resp as any).model
const blocks: any[] = Array.isArray((resp as any).content) ? (resp as any).content : []
@@ -397,7 +412,9 @@ export function fromAnthropicResponse(resp: any): CommonResponse {
const ct = typeof (u as any).output_tokens === "number" ? (u as any).output_tokens : undefined
const total = pt != null && ct != null ? pt + ct : undefined
const cached =
- typeof (u as any).cache_read_input_tokens === "number" ? (u as any).cache_read_input_tokens : undefined
+ typeof (u as any).cache_read_input_tokens === "number"
+ ? (u as any).cache_read_input_tokens
+ : undefined
const details = cached != null ? { cached_tokens: cached } : undefined
return {
prompt_tokens: pt,
@@ -452,7 +469,12 @@ export function toAnthropicResponse(resp: CommonResponse) {
} catch {
input = (tc as any).function.arguments
}
- content.push({ type: "tool_use", id: (tc as any).id, name: (tc as any).function.name, input })
+ content.push({
+ type: "tool_use",
+ id: (tc as any).id,
+ name: (tc as any).function.name,
+ input,
+ })
}
}
}
@@ -511,13 +533,22 @@ export function fromAnthropicChunk(chunk: string): CommonChunk | string {
if (json.type === "content_block_start") {
const cb = json.content_block
if (cb?.type === "text") {
- out.choices.push({ index: json.index ?? 0, delta: { role: "assistant", content: "" }, finish_reason: null })
+ out.choices.push({
+ index: json.index ?? 0,
+ delta: { role: "assistant", content: "" },
+ finish_reason: null,
+ })
} else if (cb?.type === "tool_use") {
out.choices.push({
index: json.index ?? 0,
delta: {
tool_calls: [
- { index: json.index ?? 0, id: cb.id, type: "function", function: { name: cb.name, arguments: "" } },
+ {
+ index: json.index ?? 0,
+ id: cb.id,
+ type: "function",
+ function: { name: cb.name, arguments: "" },
+ },
],
},
finish_reason: null,
@@ -532,7 +563,9 @@ export function fromAnthropicChunk(chunk: string): CommonChunk | string {
} else if (d?.type === "input_json_delta") {
out.choices.push({
index: json.index ?? 0,
- delta: { tool_calls: [{ index: json.index ?? 0, function: { arguments: d.partial_json } }] },
+ delta: {
+ tool_calls: [{ index: json.index ?? 0, function: { arguments: d.partial_json } }],
+ },
finish_reason: null,
})
}
@@ -558,7 +591,9 @@ export function fromAnthropicChunk(chunk: string): CommonChunk | string {
prompt_tokens: u.input_tokens,
completion_tokens: u.output_tokens,
total_tokens: (u.input_tokens || 0) + (u.output_tokens || 0),
- ...(u.cache_read_input_tokens ? { prompt_tokens_details: { cached_tokens: u.cache_read_input_tokens } } : {}),
+ ...(u.cache_read_input_tokens
+ ? { prompt_tokens_details: { cached_tokens: u.cache_read_input_tokens } }
+ : {}),
}
}
diff --git a/packages/console/app/src/routes/zen/util/provider/openai-compatible.ts b/packages/console/app/src/routes/zen/util/provider/openai-compatible.ts
index daf650275..d69985728 100644
--- a/packages/console/app/src/routes/zen/util/provider/openai-compatible.ts
+++ b/packages/console/app/src/routes/zen/util/provider/openai-compatible.ts
@@ -57,7 +57,8 @@ export const oaCompatHelper = {
const inputTokens = usage.prompt_tokens ?? 0
const outputTokens = usage.completion_tokens ?? 0
const reasoningTokens = usage.completion_tokens_details?.reasoning_tokens ?? undefined
- const cacheReadTokens = usage.cached_tokens ?? usage.prompt_tokens_details?.cached_tokens ?? undefined
+ const cacheReadTokens =
+ usage.cached_tokens ?? usage.prompt_tokens_details?.cached_tokens ?? undefined
return {
inputTokens: inputTokens - (cacheReadTokens ?? 0),
outputTokens,
@@ -79,7 +80,8 @@ export function fromOaCompatibleRequest(body: any): CommonRequest {
if (!m || !m.role) continue
if (m.role === "system") {
- if (typeof m.content === "string" && m.content.length > 0) msgsOut.push({ role: "system", content: m.content })
+ if (typeof m.content === "string" && m.content.length > 0)
+ msgsOut.push({ role: "system", content: m.content })
continue
}
@@ -90,10 +92,12 @@ export function fromOaCompatibleRequest(body: any): CommonRequest {
const parts: any[] = []
for (const p of m.content) {
if (!p || !p.type) continue
- if (p.type === "text" && typeof p.text === "string") parts.push({ type: "text", text: p.text })
+ if (p.type === "text" && typeof p.text === "string")
+ parts.push({ type: "text", text: p.text })
if (p.type === "image_url") parts.push({ type: "image_url", image_url: p.image_url })
}
- if (parts.length === 1 && parts[0].type === "text") msgsOut.push({ role: "user", content: parts[0].text })
+ if (parts.length === 1 && parts[0].type === "text")
+ msgsOut.push({ role: "user", content: parts[0].text })
else if (parts.length > 0) msgsOut.push({ role: "user", content: parts })
}
continue
@@ -137,7 +141,8 @@ export function toOaCompatibleRequest(body: CommonRequest) {
if (p.type === "image_url" && p.image_url) return { type: "image_url", image_url: p.image_url }
const s = (p as any).source
if (!s || typeof s !== "object") return undefined
- if (s.type === "url" && typeof s.url === "string") return { type: "image_url", image_url: { url: s.url } }
+ if (s.type === "url" && typeof s.url === "string")
+ return { type: "image_url", image_url: { url: s.url } }
if (s.type === "base64" && typeof s.media_type === "string" && typeof s.data === "string")
return { type: "image_url", image_url: { url: `data:${s.media_type};base64,${s.data}` } }
return undefined
@@ -147,7 +152,8 @@ export function toOaCompatibleRequest(body: CommonRequest) {
if (!m || !m.role) continue
if (m.role === "system") {
- if (typeof m.content === "string" && m.content.length > 0) msgsOut.push({ role: "system", content: m.content })
+ if (typeof m.content === "string" && m.content.length > 0)
+ msgsOut.push({ role: "system", content: m.content })
continue
}
@@ -160,11 +166,13 @@ export function toOaCompatibleRequest(body: CommonRequest) {
const parts: any[] = []
for (const p of m.content) {
if (!p || !p.type) continue
- if (p.type === "text" && typeof p.text === "string") parts.push({ type: "text", text: p.text })
+ if (p.type === "text" && typeof p.text === "string")
+ parts.push({ type: "text", text: p.text })
const ip = toImg(p)
if (ip) parts.push(ip)
}
- if (parts.length === 1 && parts[0].type === "text") msgsOut.push({ role: "user", content: parts[0].text })
+ if (parts.length === 1 && parts[0].type === "text")
+ msgsOut.push({ role: "user", content: parts[0].text })
else if (parts.length > 0) msgsOut.push({ role: "user", content: parts })
}
continue
@@ -317,7 +325,9 @@ export function toOaCompatibleResponse(resp: CommonResponse) {
const idIn = (resp as any).id
const id =
- typeof idIn === "string" ? idIn.replace(/^msg_/, "chatcmpl_") : `chatcmpl_${Math.random().toString(36).slice(2)}`
+ typeof idIn === "string"
+ ? idIn.replace(/^msg_/, "chatcmpl_")
+ : `chatcmpl_${Math.random().toString(36).slice(2)}`
const model = (resp as any).model
const blocks: any[] = Array.isArray((resp as any).content) ? (resp as any).content : []
@@ -359,7 +369,8 @@ export function toOaCompatibleResponse(resp: CommonResponse) {
const pt = typeof u.input_tokens === "number" ? u.input_tokens : undefined
const ct = typeof u.output_tokens === "number" ? u.output_tokens : undefined
const total = pt != null && ct != null ? pt + ct : undefined
- const cached = typeof u.cache_read_input_tokens === "number" ? u.cache_read_input_tokens : undefined
+ const cached =
+ typeof u.cache_read_input_tokens === "number" ? u.cache_read_input_tokens : undefined
const details = cached != null ? { cached_tokens: cached } : undefined
return {
prompt_tokens: pt,
@@ -532,7 +543,9 @@ export function toOaCompatibleChunk(chunk: CommonChunk): string {
total_tokens: chunk.usage.total_tokens,
...(chunk.usage.prompt_tokens_details?.cached_tokens
? {
- prompt_tokens_details: { cached_tokens: chunk.usage.prompt_tokens_details.cached_tokens },
+ prompt_tokens_details: {
+ cached_tokens: chunk.usage.prompt_tokens_details.cached_tokens,
+ },
}
: {}),
}
diff --git a/packages/console/app/src/routes/zen/util/provider/openai.ts b/packages/console/app/src/routes/zen/util/provider/openai.ts
index d17300991..fa0776b7a 100644
--- a/packages/console/app/src/routes/zen/util/provider/openai.ts
+++ b/packages/console/app/src/routes/zen/util/provider/openai.ts
@@ -77,13 +77,20 @@ export function fromOpenaiRequest(body: any): CommonRequest {
typeof (s as any).media_type === "string" &&
typeof (s as any).data === "string"
)
- return { type: "image_url", image_url: { url: `data:${(s as any).media_type};base64,${(s as any).data}` } }
+ return {
+ type: "image_url",
+ image_url: { url: `data:${(s as any).media_type};base64,${(s as any).data}` },
+ }
return undefined
}
const msgs: any[] = []
- const inMsgs = Array.isArray(body.input) ? body.input : Array.isArray(body.messages) ? body.messages : []
+ const inMsgs = Array.isArray(body.input)
+ ? body.input
+ : Array.isArray(body.messages)
+ ? body.messages
+ : []
for (const m of inMsgs) {
if (!m) continue
@@ -96,7 +103,9 @@ export function fromOpenaiRequest(body: any): CommonRequest {
const args = typeof a === "string" ? a : JSON.stringify(a ?? {})
msgs.push({
role: "assistant",
- tool_calls: [{ id: (m as any).id, type: "function", function: { name, arguments: args } }],
+ tool_calls: [
+ { id: (m as any).id, type: "function", function: { name, arguments: args } },
+ ],
})
}
if ((m as any).type === "function_call_output") {
@@ -113,7 +122,8 @@ export function fromOpenaiRequest(body: any): CommonRequest {
if (typeof c === "string" && c.length > 0) msgs.push({ role: "system", content: c })
if (Array.isArray(c)) {
const t = c.find((p: any) => p && typeof p.text === "string")
- if (t && typeof t.text === "string" && t.text.length > 0) msgs.push({ role: "system", content: t.text })
+ if (t && typeof t.text === "string" && t.text.length > 0)
+ msgs.push({ role: "system", content: t.text })
}
continue
}
@@ -126,18 +136,24 @@ export function fromOpenaiRequest(body: any): CommonRequest {
const parts: any[] = []
for (const p of c) {
if (!p || !(p as any).type) continue
- if (((p as any).type === "text" || (p as any).type === "input_text") && typeof (p as any).text === "string")
+ if (
+ ((p as any).type === "text" || (p as any).type === "input_text") &&
+ typeof (p as any).text === "string"
+ )
parts.push({ type: "text", text: (p as any).text })
const ip = toImg(p)
if (ip) parts.push(ip)
if ((p as any).type === "tool_result") {
const id = (p as any).tool_call_id
const content =
- typeof (p as any).content === "string" ? (p as any).content : JSON.stringify((p as any).content)
+ typeof (p as any).content === "string"
+ ? (p as any).content
+ : JSON.stringify((p as any).content)
msgs.push({ role: "tool", tool_call_id: id, content })
}
}
- if (parts.length === 1 && parts[0].type === "text") msgs.push({ role: "user", content: parts[0].text })
+ if (parts.length === 1 && parts[0].type === "text")
+ msgs.push({ role: "user", content: parts[0].text })
else if (parts.length > 0) msgs.push({ role: "user", content: parts })
}
continue
@@ -153,7 +169,11 @@ export function fromOpenaiRequest(body: any): CommonRequest {
}
if ((m as any).role === "tool") {
- msgs.push({ role: "tool", tool_call_id: (m as any).tool_call_id, content: (m as any).content })
+ msgs.push({
+ role: "tool",
+ tool_call_id: (m as any).tool_call_id,
+ content: (m as any).content,
+ })
continue
}
}
@@ -210,7 +230,10 @@ export function toOpenaiRequest(body: CommonRequest) {
typeof (s as any).media_type === "string" &&
typeof (s as any).data === "string"
)
- return { type: "input_image", image_url: { url: `data:${(s as any).media_type};base64,${(s as any).data}` } }
+ return {
+ type: "input_image",
+ image_url: { url: `data:${(s as any).media_type};base64,${(s as any).data}` },
+ }
return undefined
}
@@ -257,7 +280,10 @@ export function toOpenaiRequest(body: CommonRequest) {
}
if ((m as any).role === "tool") {
- const out = typeof (m as any).content === "string" ? (m as any).content : JSON.stringify((m as any).content)
+ const out =
+ typeof (m as any).content === "string"
+ ? (m as any).content
+ : JSON.stringify((m as any).content)
input.push({ type: "function_call_output", call_id: (m as any).tool_call_id, output: out })
continue
}
@@ -325,7 +351,9 @@ export function fromOpenaiResponse(resp: any): CommonResponse {
const idIn = (r as any).id
const id =
- typeof idIn === "string" ? idIn.replace(/^resp_/, "chatcmpl_") : `chatcmpl_${Math.random().toString(36).slice(2)}`
+ typeof idIn === "string"
+ ? idIn.replace(/^resp_/, "chatcmpl_")
+ : `chatcmpl_${Math.random().toString(36).slice(2)}`
const model = (r as any).model ?? (resp as any).model
const out = Array.isArray((r as any).output) ? (r as any).output : []
@@ -452,7 +480,9 @@ export function toOpenaiResponse(resp: CommonResponse) {
})()
return {
- id: (resp as any).id?.replace(/^chatcmpl_/, "resp_") ?? `resp_${Math.random().toString(36).slice(2)}`,
+ id:
+ (resp as any).id?.replace(/^chatcmpl_/, "resp_") ??
+ `resp_${Math.random().toString(36).slice(2)}`,
object: "response",
model: (resp as any).model,
output: outputItems,
@@ -498,7 +528,9 @@ export function fromOpenaiChunk(chunk: string): CommonChunk | string {
if (typeof name === "string" && name.length > 0) {
out.choices.push({
index: 0,
- delta: { tool_calls: [{ index: 0, id, type: "function", function: { name, arguments: "" } }] },
+ delta: {
+ tool_calls: [{ index: 0, id, type: "function", function: { name, arguments: "" } }],
+ },
finish_reason: null,
})
}
@@ -555,7 +587,12 @@ export function toOpenaiChunk(chunk: CommonChunk): string {
const model = chunk.model
if (d.content) {
- const data = { id, type: "response.output_text.delta", delta: d.content, response: { id, model } }
+ const data = {
+ id,
+ type: "response.output_text.delta",
+ delta: d.content,
+ response: { id, model },
+ }
return `event: response.output_text.delta\ndata: ${JSON.stringify(data)}`
}
@@ -565,7 +602,13 @@ export function toOpenaiChunk(chunk: CommonChunk): string {
const data = {
type: "response.output_item.added",
output_index: 0,
- item: { id: tc.id, type: "function_call", name: tc.function.name, call_id: tc.id, arguments: "" },
+ item: {
+ id: tc.id,
+ type: "function_call",
+ name: tc.function.name,
+ call_id: tc.id,
+ arguments: "",
+ },
}
return `event: response.output_item.added\ndata: ${JSON.stringify(data)}`
}
@@ -593,7 +636,11 @@ export function toOpenaiChunk(chunk: CommonChunk): string {
}
: undefined
- const data: any = { id, type: "response.completed", response: { id, model, ...(usage ? { usage } : {}) } }
+ const data: any = {
+ id,
+ type: "response.completed",
+ response: { id, model, ...(usage ? { usage } : {}) },
+ }
return `event: response.completed\ndata: ${JSON.stringify(data)}`
}