mirror of
https://github.com/rustfs/console.git
synced 2026-10-31 03:52:11 +08:00
fix: json parse
This commit is contained in:
@@ -47,6 +47,13 @@ jobs:
|
||||
ANTHROPIC_AUTH_TOKEN: ${{ secrets.ANTHROPIC_AUTH_TOKEN }}
|
||||
ANTHROPIC_BASE_URL: ${{ secrets.ANTHROPIC_BASE_URL }}
|
||||
ANTHROPIC_MODEL: ${{ secrets.ANTHROPIC_MODEL }}
|
||||
ANTHROPIC_DEFAULT_HAIKU_MODEL: claude-haiku-4.5
|
||||
ANTHROPIC_DEFAULT_SONNET_MODEL: claude-sonnet-4.6
|
||||
ANTHROPIC_DEFAULT_OPUS_MODEL: claude-opus-4.6
|
||||
ANTHROPIC_TIMEOUT_MS: 180000
|
||||
ANTHROPIC_MAX_RETRIES: 3
|
||||
ANTHROPIC_RETRY_BASE_MS: 2000
|
||||
ANTHROPIC_MAX_TOKENS: 2048
|
||||
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||
ISSUE_TITLE: ${{ github.event.issue.title }}
|
||||
ISSUE_BODY: ${{ github.event.issue.body }}
|
||||
|
||||
@@ -69,6 +69,77 @@ function shouldRetry(status) {
|
||||
return status === 408 || status === 429 || status >= 500
|
||||
}
|
||||
|
||||
function tryParseJson(text) {
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
function extractLastJsonObject(text) {
|
||||
const cleaned = text
|
||||
.trim()
|
||||
.replace(/^```(?:json)?\s*/i, "")
|
||||
.replace(/\s*```$/, "")
|
||||
|
||||
const direct = tryParseJson(cleaned)
|
||||
if (direct && typeof direct === "object") {
|
||||
return direct
|
||||
}
|
||||
|
||||
let start = -1
|
||||
let depth = 0
|
||||
let inString = false
|
||||
let escaping = false
|
||||
const candidates = []
|
||||
|
||||
for (let i = 0; i < cleaned.length; i += 1) {
|
||||
const ch = cleaned[i]
|
||||
|
||||
if (escaping) {
|
||||
escaping = false
|
||||
continue
|
||||
}
|
||||
|
||||
if (ch === "\\") {
|
||||
escaping = true
|
||||
continue
|
||||
}
|
||||
|
||||
if (ch === '"') {
|
||||
inString = !inString
|
||||
continue
|
||||
}
|
||||
|
||||
if (inString) continue
|
||||
|
||||
if (ch === "{") {
|
||||
if (depth === 0) start = i
|
||||
depth += 1
|
||||
continue
|
||||
}
|
||||
|
||||
if (ch === "}") {
|
||||
if (depth === 0) continue
|
||||
depth -= 1
|
||||
if (depth === 0 && start >= 0) {
|
||||
candidates.push(cleaned.slice(start, i + 1))
|
||||
start = -1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = candidates.length - 1; i >= 0; i -= 1) {
|
||||
const parsed = tryParseJson(candidates[i])
|
||||
if (parsed && typeof parsed === "object" && typeof parsed.patch === "string") {
|
||||
return parsed
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
async function requestClaude() {
|
||||
const endpoint = `${anthropicBaseUrl.replace(/\/$/, "")}/v1/messages`
|
||||
|
||||
@@ -154,15 +225,8 @@ if (!outputText) {
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const normalized = outputText
|
||||
.trim()
|
||||
.replace(/^```(?:json)?\s*/i, "")
|
||||
.replace(/\s*```$/, "")
|
||||
|
||||
let parsed
|
||||
try {
|
||||
parsed = JSON.parse(normalized)
|
||||
} catch {
|
||||
const parsed = extractLastJsonObject(outputText)
|
||||
if (!parsed) {
|
||||
console.error("Model output is not valid JSON")
|
||||
console.error(outputText)
|
||||
process.exit(1)
|
||||
|
||||
Reference in New Issue
Block a user