From a2f933c56844fb848384643c9c44d51e0dfb87ce Mon Sep 17 00:00:00 2001 From: EdwardSage Date: Sat, 19 Sep 2026 08:59:11 +0800 Subject: [PATCH 01/18] release: mark Qwen live verified for V0.1 --- src/features/providers/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/providers/types.ts b/src/features/providers/types.ts index a1f5871..45b4b8a 100644 --- a/src/features/providers/types.ts +++ b/src/features/providers/types.ts @@ -11,7 +11,7 @@ export const PROVIDER_METADATA: Record = { openai: { label: 'OpenAI', verification: 'experimental' }, anthropic: { label: 'Anthropic', verification: 'experimental' }, gemini: { label: 'Gemini', verification: 'experimental' }, - qwen: { label: 'Qwen (Alibaba Cloud)', verification: 'experimental' }, + qwen: { label: 'Qwen (Alibaba Cloud)', verification: 'verified' }, }; export const QWEN_REGIONS: Record = { From c6e42a257540cef292faba704d1c469014ece705 Mon Sep 17 00:00:00 2001 From: EdwardSage Date: Sat, 19 Sep 2026 08:59:15 +0800 Subject: [PATCH 02/18] release: show V0.1.0 version label --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index fe410fb..71325d0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -138,7 +138,7 @@ export default function App() { return (
-
FX

FlowExtract

v0.1 dev

Local first AI assisted document extraction, validation and human review.

+
FX

FlowExtract

v0.1.0

Local first AI assisted document extraction, validation and human review.

props.onProviderChange(e.target.value as ProviderId)}> {Object.entries(PROVIDER_METADATA).map(([id, item]) => ( - + ))} @@ -41,7 +42,7 @@ export function ExtractionPanel(props: ExtractionPanelProps) {

Document text will be sent only to the selected Qwen region ({region?.dataLocation}). FlowExtract never automatically falls back to another region.

)} -

Provider status: {metadata.verification === 'verified' ? 'live verified' : 'experimental / contract-tested until a live smoke test passes'}.

+

Provider status: {verification === 'verified' ? 'live verified for the selected region' : 'experimental / contract-tested until a live smoke test passes for the selected region'}.

The key is kept only in this page session. It is never saved to IndexedDB or project backups.

Browser BYOK exposes the entered key to this page runtime. For testing, use a dedicated provider key with a low quota or spend limit.

From 6ad3087842dfdacbdc27c722c548abf6ed4b02dc Mon Sep 17 00:00:00 2001 From: EdwardSage Date: Sat, 19 Sep 2026 09:02:03 +0800 Subject: [PATCH 15/18] test: reflect Beijing-scoped Qwen verification --- src/App.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.test.tsx b/src/App.test.tsx index bc2d6ac..3bd2911 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -23,7 +23,7 @@ describe('FlowExtract workspace', () => { expect(screen.getByText(/3\. AI Extraction/i)).toBeInTheDocument(); expect(screen.getByText(/4\. Review/i)).toBeInTheDocument(); expect(screen.getByText('v0.1.0')).toBeInTheDocument(); - expect(screen.getByRole('option', { name: /Qwen \(Alibaba Cloud\) — Verified/i })).toBeInTheDocument(); + expect(screen.getByRole('option', { name: /Qwen \(Alibaba Cloud\) — Verified in Beijing/i })).toBeInTheDocument(); }); From f10d055c33d5522ae5ddc0ce0adcf0ab36333281 Mon Sep 17 00:00:00 2001 From: EdwardSage Date: Sat, 19 Sep 2026 09:02:18 +0800 Subject: [PATCH 16/18] fix: remove unused provider metadata binding --- src/components/ExtractionPanel.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/ExtractionPanel.tsx b/src/components/ExtractionPanel.tsx index b75a46d..2680ce7 100644 --- a/src/components/ExtractionPanel.tsx +++ b/src/components/ExtractionPanel.tsx @@ -15,7 +15,6 @@ interface ExtractionPanelProps { } export function ExtractionPanel(props: ExtractionPanelProps) { - const metadata = PROVIDER_METADATA[props.provider]; const verification = getProviderVerification(props.provider, props.provider === 'qwen' ? props.qwenRegion : undefined); const region = props.provider === 'qwen' ? QWEN_REGIONS[props.qwenRegion] : null; return ( From 5dd043147e1d4977d091a4d29f0379387137697c Mon Sep 17 00:00:00 2001 From: EdwardSage Date: Sat, 19 Sep 2026 09:02:21 +0800 Subject: [PATCH 17/18] test: scope live verification to tested Qwen region --- src/features/providers/providers.node.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/features/providers/providers.node.test.ts b/src/features/providers/providers.node.test.ts index b687748..5bc5463 100644 --- a/src/features/providers/providers.node.test.ts +++ b/src/features/providers/providers.node.test.ts @@ -117,3 +117,10 @@ test('default provider fetch keeps the browser fetch receiver valid', async () = globalThis.fetch = originalFetch; } }); + +test('Qwen live verification is scoped to Beijing', () => { + assert.equal(getProviderVerification('qwen', 'cn-beijing'), 'verified'); + assert.equal(getProviderVerification('qwen', 'ap-southeast-1'), 'experimental'); + assert.equal(getProviderVerification('qwen', 'cn-hongkong'), 'experimental'); + assert.equal(getProviderVerification('openai'), 'experimental'); +}); From 0e322b64072c2322b920768076260f5869937ac3 Mon Sep 17 00:00:00 2001 From: EdwardSage Date: Sat, 19 Sep 2026 09:03:16 +0800 Subject: [PATCH 18/18] test: import provider verification helper --- src/features/providers/providers.node.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/features/providers/providers.node.test.ts b/src/features/providers/providers.node.test.ts index 5bc5463..c007315 100644 --- a/src/features/providers/providers.node.test.ts +++ b/src/features/providers/providers.node.test.ts @@ -1,6 +1,7 @@ import assert from 'node:assert/strict'; import test from 'node:test'; import { createProvider, parseProviderJson } from './providers.ts'; +import { getProviderVerification } from './types.ts'; const jsonSchema = { type: 'object', properties: { amount: { type: ['number', 'null'] } }, required: ['amount'], additionalProperties: false };