feat(keyboard): ship AI mode surface with streaming search answers

Add the AI keyboard tab, Agent settings, and user-owned LLM key path for 1.7.0, including streaming answers and web-search transports without the built-in DeepSeek fallback.
This commit is contained in:
Rocky
2026-08-11 01:06:27 +08:00
parent f6212dcd2c
commit 3de665d254
81 changed files with 4467 additions and 398 deletions
+6 -2
View File
@@ -16,7 +16,9 @@ Usage:
import argparse
import concurrent.futures
import json
import os
import re
import sys
import time
import urllib.request
from collections import Counter, defaultdict
@@ -26,7 +28,6 @@ ROOT = Path(__file__).resolve().parents[1]
SHARED = ROOT / "OSGKeyboardShared"
STYLE_DIR = SHARED / "Resources" / "PolishStyles"
COMPOSER = SHARED / "Services" / "PolishPromptComposer.swift"
KEYFILE = SHARED / "Services" / "PreconfiguredKeys.local.swift"
ENDPOINT = "https://api.deepseek.com/chat/completions"
MODEL = "deepseek-v4-flash"
@@ -351,7 +352,10 @@ def main() -> None:
parser.add_argument("--output", default=".tmp/polish-question-stress.json")
args = parser.parse_args()
api_key = re.search(r'deepseek = "([^"]+)"', KEYFILE.read_text()).group(1)
api_key = os.environ.get("DEEPSEEK_API_KEY", "").strip()
if not api_key:
print("Set DEEPSEEK_API_KEY to run this live eval.", file=sys.stderr)
raise SystemExit(2)
styles = STYLES if args.styles == "all" else [
item.strip() for item in args.styles.split(",") if item.strip()
]