perf(asr): speed up local Flow dictation and land CLM/keyboard refactor
Reduce perceived latency from key release to final text: - Adaptive chunking: 2.5s first chunk + 5s follow-ups so short utterances start on-device recognition while still recording. - Session-level ASR warmup and audio-format cache reuse to remove per-utterance cold-start of SpeechAnalyzer. - Mirror live pipelined partials to the keyboard transcript line via a new flow.transcriptionPartial App Group key + Darwin ping. Also commits the accumulated custom language model, Flow session, keyboard extension restructure, and Xiaomi MiMo provider work in progress on this branch.
This commit is contained in:
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
# check_l10n_keys.sh
|
||||
# Compares localization key sets across App / Extension / Shared bundles.
|
||||
# Fails when a key referenced in Shared.strings is missing from any bundle
|
||||
# that should mirror it, or when Shared keys are absent from Shared.strings.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
|
||||
extract_keys() {
|
||||
local file="$1"
|
||||
grep -E '^"[^"]+"' "$file" 2>/dev/null | sed -E 's/^"([^"]+)".*/\1/' | sort -u
|
||||
}
|
||||
|
||||
SHARED_EN="$ROOT/OSGKeyboardShared/en.lproj/Shared.strings"
|
||||
SHARED_ZH="$ROOT/OSGKeyboardShared/zh-Hans.lproj/Shared.strings"
|
||||
APP_EN="$ROOT/OSGKeyboard/en.lproj/Localizable.strings"
|
||||
APP_ZH="$ROOT/OSGKeyboard/zh-Hans.lproj/Localizable.strings"
|
||||
EXT_EN="$ROOT/OSGKeyboardExt/en.lproj/Keyboard.strings"
|
||||
EXT_ZH="$ROOT/OSGKeyboardExt/zh-Hans.lproj/Keyboard.strings"
|
||||
|
||||
fail=0
|
||||
|
||||
compare_pair() {
|
||||
local left="$1"
|
||||
local right="$2"
|
||||
local label="$3"
|
||||
local missing
|
||||
missing="$(comm -23 "$left" "$right" || true)"
|
||||
if [[ -n "$missing" ]]; then
|
||||
echo "❌ $label — keys in first file missing from second:"
|
||||
echo "$missing" | sed 's/^/ /'
|
||||
fail=1
|
||||
fi
|
||||
}
|
||||
|
||||
SHARED_EN_KEYS="$(mktemp)"
|
||||
SHARED_ZH_KEYS="$(mktemp)"
|
||||
APP_EN_KEYS="$(mktemp)"
|
||||
APP_ZH_KEYS="$(mktemp)"
|
||||
EXT_EN_KEYS="$(mktemp)"
|
||||
EXT_ZH_KEYS="$(mktemp)"
|
||||
trap 'rm -f "$SHARED_EN_KEYS" "$SHARED_ZH_KEYS" "$APP_EN_KEYS" "$APP_ZH_KEYS" "$EXT_EN_KEYS" "$EXT_ZH_KEYS"' EXIT
|
||||
|
||||
extract_keys "$SHARED_EN" > "$SHARED_EN_KEYS"
|
||||
extract_keys "$SHARED_ZH" > "$SHARED_ZH_KEYS"
|
||||
extract_keys "$APP_EN" > "$APP_EN_KEYS"
|
||||
extract_keys "$APP_ZH" > "$APP_ZH_KEYS"
|
||||
extract_keys "$EXT_EN" > "$EXT_EN_KEYS"
|
||||
extract_keys "$EXT_ZH" > "$EXT_ZH_KEYS"
|
||||
|
||||
compare_pair "$SHARED_EN_KEYS" "$SHARED_ZH_KEYS" "Shared en vs zh-Hans"
|
||||
compare_pair "$SHARED_ZH_KEYS" "$SHARED_EN_KEYS" "Shared zh-Hans vs en"
|
||||
compare_pair "$APP_EN_KEYS" "$APP_ZH_KEYS" "App Localizable en vs zh-Hans"
|
||||
compare_pair "$APP_ZH_KEYS" "$APP_EN_KEYS" "App Localizable zh-Hans vs en"
|
||||
compare_pair "$EXT_EN_KEYS" "$EXT_ZH_KEYS" "Extension Keyboard en vs zh-Hans"
|
||||
compare_pair "$EXT_ZH_KEYS" "$EXT_EN_KEYS" "Extension Keyboard zh-Hans vs en"
|
||||
|
||||
if [[ "$fail" -ne 0 ]]; then
|
||||
echo ""
|
||||
echo "L10n key parity check failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ L10n key parity check passed (Shared / App / Extension en ↔ zh-Hans)."
|
||||
@@ -1,15 +1,19 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Build OSGKeyboard custom ASR lexicon v1 from Sogou-derived sources.
|
||||
"""Build OSGKeyboard domain ASR lexicon v1 from the computer-terms scel source.
|
||||
|
||||
Sources (experimentation only — Sogou data is non-commercial):
|
||||
1. ASC8384/SogouPopularDict accumulated pinyin TSV
|
||||
2. Local 计算机词汇大全【官方推荐】.scel
|
||||
3. Local 网络流行新词.scel
|
||||
Sources:
|
||||
Local 计算机词汇大全【官方推荐】.scel (IT / computer vocabulary only)
|
||||
|
||||
Casual network slang and Sogou popular-word dumps are intentionally excluded —
|
||||
they dilute custom LM phrase biasing without improving domain ASR accuracy.
|
||||
|
||||
Output:
|
||||
OSGKeyboard/Resources/CustomLanguageModel/v1/phrases.tsv
|
||||
OSGKeyboard/Resources/CustomLanguageModel/v1/manifest.json
|
||||
|
||||
The compiled .bin asset is exported separately to
|
||||
OSGKeyboardShared/Resources/CustomLanguageModel/v1/ via export_clm.swift.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -17,43 +21,19 @@ from __future__ import annotations
|
||||
import argparse
|
||||
import json
|
||||
import sys
|
||||
import urllib.request
|
||||
from collections import Counter
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
from scel_parser import get_scel_info, load_pinyin_tsv, parse_scel_file
|
||||
from scel_parser import get_scel_info, parse_scel_file
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[2]
|
||||
DEFAULT_OUTPUT_DIR = REPO_ROOT / "OSGKeyboard/Resources/CustomLanguageModel/v1"
|
||||
SOGOU_ACCUMULATED_URL = (
|
||||
"https://raw.githubusercontent.com/ASC8384/SogouPopularDict/main/"
|
||||
"data/sogou_network_words_accumulated_pinyin.tsv"
|
||||
)
|
||||
|
||||
DEFAULT_COMPUTER_SCEL = Path("/Users/rocky/Downloads/计算机词汇大全【官方推荐】.scel")
|
||||
DEFAULT_NETWORK_SCEL = Path("/Users/rocky/Downloads/网络流行新词.scel")
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class SourceSpec:
|
||||
key: str
|
||||
label: str
|
||||
weight: int
|
||||
|
||||
|
||||
SOURCES = [
|
||||
SourceSpec("computer_terms", "计算机词汇大全【官方推荐】", weight=5),
|
||||
SourceSpec("network_slang_local", "网络流行新词.scel", weight=3),
|
||||
SourceSpec("sogou_popular_accumulated", "SogouPopularDict accumulated", weight=1),
|
||||
]
|
||||
|
||||
|
||||
def download_accumulated_tsv(destination: Path) -> None:
|
||||
destination.parent.mkdir(parents=True, exist_ok=True)
|
||||
with urllib.request.urlopen(SOGOU_ACCUMULATED_URL, timeout=120) as response:
|
||||
destination.write_bytes(response.read())
|
||||
SOURCE_KEY = "computer_terms"
|
||||
SOURCE_LABEL = "计算机词汇大全【官方推荐】"
|
||||
SOURCE_WEIGHT = 5
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -64,24 +44,26 @@ class LexiconEntry:
|
||||
weight: int
|
||||
|
||||
|
||||
def merge_entries(sources: list[tuple[SourceSpec, list[tuple[str, str]]]]) -> list[LexiconEntry]:
|
||||
def merge_entries(entries: list[tuple[str, str]]) -> list[LexiconEntry]:
|
||||
merged: dict[str, LexiconEntry] = {}
|
||||
source_counts: Counter[str] = Counter()
|
||||
|
||||
for spec, entries in sources:
|
||||
for word, pinyin in entries:
|
||||
source_counts[spec.key] += 1
|
||||
current = merged.get(word)
|
||||
candidate = LexiconEntry(word=word, pinyin=pinyin, source=spec.key, weight=spec.weight)
|
||||
if current is None or candidate.weight > current.weight:
|
||||
merged[word] = candidate
|
||||
elif current.weight == candidate.weight and not current.pinyin and pinyin:
|
||||
merged[word] = candidate
|
||||
for word, pinyin in entries:
|
||||
current = merged.get(word)
|
||||
candidate = LexiconEntry(
|
||||
word=word,
|
||||
pinyin=pinyin,
|
||||
source=SOURCE_KEY,
|
||||
weight=SOURCE_WEIGHT,
|
||||
)
|
||||
if current is None:
|
||||
merged[word] = candidate
|
||||
elif not current.pinyin and pinyin:
|
||||
merged[word] = candidate
|
||||
|
||||
return sorted(merged.values(), key=lambda item: (item.weight * -1, item.word))
|
||||
return sorted(merged.values(), key=lambda item: item.word)
|
||||
|
||||
|
||||
def write_outputs(entries: list[LexiconEntry], output_dir: Path, source_stats: dict[str, int]) -> None:
|
||||
def write_outputs(entries: list[LexiconEntry], output_dir: Path, raw_count: int) -> None:
|
||||
output_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
phrases_path = output_dir / "phrases.tsv"
|
||||
@@ -97,17 +79,16 @@ def write_outputs(entries: list[LexiconEntry], output_dir: Path, source_stats: d
|
||||
"entry_count": len(entries),
|
||||
"sources": [
|
||||
{
|
||||
"key": spec.key,
|
||||
"label": spec.label,
|
||||
"weight": spec.weight,
|
||||
"raw_count": source_stats.get(spec.key, 0),
|
||||
"key": SOURCE_KEY,
|
||||
"label": SOURCE_LABEL,
|
||||
"weight": SOURCE_WEIGHT,
|
||||
"raw_count": raw_count,
|
||||
}
|
||||
for spec in SOURCES
|
||||
],
|
||||
"notes": [
|
||||
"Sogou-derived data is for internal ASR experimentation only.",
|
||||
"Domain-specific computer/IT vocabulary only; casual network slang removed.",
|
||||
"PhraseCount weights map to SFCustomLanguageModelData relative frequencies.",
|
||||
"Higher source weight wins on duplicate words.",
|
||||
"Merged with ai-tech-brands seed at export time for the final .bin asset.",
|
||||
],
|
||||
"files": {
|
||||
"phrases": phrases_path.name,
|
||||
@@ -118,47 +99,19 @@ def write_outputs(entries: list[LexiconEntry], output_dir: Path, source_stats: d
|
||||
manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
|
||||
|
||||
def build(
|
||||
*,
|
||||
computer_scel: Path,
|
||||
network_scel: Path,
|
||||
output_dir: Path,
|
||||
skip_download: bool,
|
||||
) -> int:
|
||||
cache_dir = REPO_ROOT / ".cache/lexicon"
|
||||
cache_dir.mkdir(parents=True, exist_ok=True)
|
||||
accumulated_tsv = cache_dir / "sogou_network_words_accumulated_pinyin.tsv"
|
||||
|
||||
if not skip_download and not accumulated_tsv.exists():
|
||||
print(f"Downloading {SOGOU_ACCUMULATED_URL} …")
|
||||
download_accumulated_tsv(accumulated_tsv)
|
||||
elif not accumulated_tsv.exists():
|
||||
print(f"Missing accumulated TSV: {accumulated_tsv}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
def build(*, computer_scel: Path, output_dir: Path) -> int:
|
||||
if not computer_scel.exists():
|
||||
print(f"Missing computer scel: {computer_scel}", file=sys.stderr)
|
||||
return 1
|
||||
if not network_scel.exists():
|
||||
print(f"Missing network scel: {network_scel}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
computer_info = get_scel_info(computer_scel)
|
||||
network_info = get_scel_info(network_scel)
|
||||
print(f"Computer dict: {computer_info.name} ({computer_info.word_count} header count)")
|
||||
print(f"Network dict: {network_info.name} ({network_info.word_count} header count)")
|
||||
|
||||
loaded_sources: list[tuple[SourceSpec, list[tuple[str, str]]]] = [
|
||||
(SOURCES[0], parse_scel_file(computer_scel)),
|
||||
(SOURCES[1], parse_scel_file(network_scel)),
|
||||
(SOURCES[2], load_pinyin_tsv(accumulated_tsv)),
|
||||
]
|
||||
raw_entries = parse_scel_file(computer_scel)
|
||||
merged = merge_entries(raw_entries)
|
||||
write_outputs(merged, output_dir, raw_count=len(raw_entries))
|
||||
|
||||
source_stats = {spec.key: len(entries) for spec, entries in loaded_sources}
|
||||
merged = merge_entries(loaded_sources)
|
||||
write_outputs(merged, output_dir, source_stats)
|
||||
|
||||
print(f"Raw counts: {source_stats}")
|
||||
print(f"Raw count: {len(raw_entries)}")
|
||||
print(f"Merged unique entries: {len(merged)}")
|
||||
print(f"Wrote {output_dir / 'phrases.tsv'}")
|
||||
print(f"Wrote {output_dir / 'manifest.json'}")
|
||||
@@ -166,18 +119,11 @@ def build(
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Build OSGKeyboard custom ASR lexicon v1")
|
||||
parser = argparse.ArgumentParser(description="Build OSGKeyboard domain ASR lexicon v1")
|
||||
parser.add_argument("--computer-scel", type=Path, default=DEFAULT_COMPUTER_SCEL)
|
||||
parser.add_argument("--network-scel", type=Path, default=DEFAULT_NETWORK_SCEL)
|
||||
parser.add_argument("--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR)
|
||||
parser.add_argument("--skip-download", action="store_true")
|
||||
args = parser.parse_args()
|
||||
return build(
|
||||
computer_scel=args.computer_scel,
|
||||
network_scel=args.network_scel,
|
||||
output_dir=args.output_dir,
|
||||
skip_download=args.skip_download,
|
||||
)
|
||||
return build(computer_scel=args.computer_scel, output_dir=args.output_dir)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -15,7 +15,7 @@ import Speech
|
||||
// MARK: - CLI
|
||||
|
||||
struct CLIOptions {
|
||||
var sogouTSV: URL
|
||||
var domainTSV: URL
|
||||
var aiTechTSV: URL
|
||||
var outputBin: URL
|
||||
var localeID: String
|
||||
@@ -29,14 +29,14 @@ struct CLIOptions {
|
||||
.deletingLastPathComponent()
|
||||
.deletingLastPathComponent()
|
||||
|
||||
var sogou = repoRoot.appendingPathComponent(
|
||||
var domain = repoRoot.appendingPathComponent(
|
||||
"OSGKeyboard/Resources/CustomLanguageModel/v1/phrases.tsv"
|
||||
)
|
||||
var aiTech = repoRoot.appendingPathComponent(
|
||||
"OSGKeyboard/Resources/CustomLanguageModel/ai-tech-brands/v1/phrases.tsv"
|
||||
)
|
||||
var output = repoRoot.appendingPathComponent(
|
||||
"OSGKeyboard/Resources/CustomLanguageModel/v1/OSGKeyboardCLM.bin"
|
||||
"OSGKeyboardShared/Resources/CustomLanguageModel/v1/OSGKeyboardCLM.bin"
|
||||
)
|
||||
var localeID = "zh_CN"
|
||||
var modelID = "com.osgkeyboard.custom-lm.v1"
|
||||
@@ -46,8 +46,8 @@ struct CLIOptions {
|
||||
var iterator = CommandLine.arguments.dropFirst().makeIterator()
|
||||
while let flag = iterator.next() {
|
||||
switch flag {
|
||||
case "--sogou-tsv":
|
||||
sogou = URL(fileURLWithPath: iterator.next() ?? "")
|
||||
case "--domain-tsv", "--sogou-tsv":
|
||||
domain = URL(fileURLWithPath: iterator.next() ?? "")
|
||||
case "--ai-tech-tsv":
|
||||
aiTech = URL(fileURLWithPath: iterator.next() ?? "")
|
||||
case "--output":
|
||||
@@ -71,7 +71,7 @@ struct CLIOptions {
|
||||
}
|
||||
|
||||
return CLIOptions(
|
||||
sogouTSV: sogou,
|
||||
domainTSV: domain,
|
||||
aiTechTSV: aiTech,
|
||||
outputBin: output,
|
||||
localeID: localeID,
|
||||
@@ -86,7 +86,7 @@ struct CLIOptions {
|
||||
export_clm.swift — build SFCustomLanguageModelData .bin on macOS
|
||||
|
||||
Options:
|
||||
--sogou-tsv <path> Sogou merged phrases TSV
|
||||
--domain-tsv <path> Domain phrases TSV (computer/IT terms)
|
||||
--ai-tech-tsv <path> AI/tech seed phrases TSV
|
||||
--output <path> Output .bin path
|
||||
--locale <id> Locale identifier (default: zh_CN)
|
||||
@@ -126,7 +126,7 @@ enum TSVLoader {
|
||||
}
|
||||
|
||||
// Formats:
|
||||
// sogou: word, pinyin, source, weight
|
||||
// domain: word, pinyin, source, weight
|
||||
// ai-tech: word, pinyin, source, category, weight, canonical
|
||||
let weight: Int
|
||||
if parts.count >= 6, let parsed = Int(parts[4]) {
|
||||
@@ -171,17 +171,17 @@ enum ExportCLM {
|
||||
let options = CLIOptions.parse()
|
||||
let fm = FileManager.default
|
||||
|
||||
guard fm.fileExists(atPath: options.sogouTSV.path) else {
|
||||
throw ExportError.missingInput(options.sogouTSV.path)
|
||||
guard fm.fileExists(atPath: options.domainTSV.path) else {
|
||||
throw ExportError.missingInput(options.domainTSV.path)
|
||||
}
|
||||
guard fm.fileExists(atPath: options.aiTechTSV.path) else {
|
||||
throw ExportError.missingInput(options.aiTechTSV.path)
|
||||
}
|
||||
|
||||
fputs("Loading phrases…\n", stderr)
|
||||
let sogou = try TSVLoader.load(from: options.sogouTSV, sourceLabel: "sogou_v1")
|
||||
let domain = try TSVLoader.load(from: options.domainTSV, sourceLabel: "computer_terms")
|
||||
let aiTech = try TSVLoader.load(from: options.aiTechTSV, sourceLabel: "ai_tech_seed")
|
||||
var merged = TSVLoader.merge([sogou, aiTech])
|
||||
var merged = TSVLoader.merge([domain, aiTech])
|
||||
|
||||
if let cap = options.maxEntries, merged.count > cap {
|
||||
merged = Array(merged.prefix(cap))
|
||||
@@ -189,7 +189,7 @@ enum ExportCLM {
|
||||
}
|
||||
|
||||
fputs(
|
||||
"Merged \(merged.count) unique phrases (sogou=\(sogou.count), ai-tech=\(aiTech.count))\n",
|
||||
"Merged \(merged.count) unique phrases (domain=\(domain.count), ai-tech=\(aiTech.count))\n",
|
||||
stderr
|
||||
)
|
||||
fputs("Locale=\(options.localeID) identifier=\(options.modelID) version=\(options.modelVersion)\n", stderr)
|
||||
@@ -236,7 +236,7 @@ enum ExportCLM {
|
||||
"version": options.modelVersion,
|
||||
"phrase_count": merged.count,
|
||||
"sources": [
|
||||
"sogou_v1": sogou.count,
|
||||
"computer_terms": domain.count,
|
||||
"ai_tech_seed": aiTech.count,
|
||||
],
|
||||
"bin_file": outputURL.lastPathComponent,
|
||||
|
||||
@@ -29,7 +29,7 @@ struct PrepareOptions {
|
||||
.deletingLastPathComponent()
|
||||
|
||||
var input = repoRoot.appendingPathComponent(
|
||||
"OSGKeyboard/Resources/CustomLanguageModel/v1/OSGKeyboardCLM.bin"
|
||||
"OSGKeyboardShared/Resources/CustomLanguageModel/v1/OSGKeyboardCLM.bin"
|
||||
)
|
||||
var output = repoRoot.appendingPathComponent(
|
||||
"OSGKeyboard/Resources/CustomLanguageModel/v1/compiled"
|
||||
|
||||
@@ -379,3 +379,242 @@ embodied AI 具身智能 tech_term 80
|
||||
数字游民 shu zi you min digital nomad tech_term 75
|
||||
远程办公 yuan cheng ban gong remote work tech_term 78
|
||||
副业 fu ye side hustle tech_term 72
|
||||
|
||||
# --- 2026 AI models, agents & coding tools ---
|
||||
GPT-5 gpt five|GPT five|ChatGPT 5 ai_model 98
|
||||
GPT-5.5 gpt five five|GPT five point five|gpt-5.5 ai_model 98
|
||||
GPT-4o gpt four o|GPT four oh|gpt4o ai_model 92
|
||||
Claude Code claude code|ClaudeCode|克劳德代码 dev_tool 96
|
||||
Claude Sonnet claude sonnet|Sonnet|Sonnet 4|Sonnet 4.6 ai_model 94
|
||||
Claude Opus claude opus|Opus|Opus 4|Opus 4.7 ai_model 94
|
||||
Composer cursor composer|Composer 2|Composer 2.5 dev_tool 92
|
||||
Cursor Composer cursor composer|Composer dev_tool 92
|
||||
OpenAI Codex openai codex|Codex|codex cli dev_tool 92
|
||||
Codex CLI codex cli|OpenAI Codex dev_tool 90
|
||||
Gemini CLI gemini cli dev_tool 88
|
||||
Gemini 2.5 Pro gemini two five pro|Gemini Pro ai_model 90
|
||||
Gemini 3 Pro gemini three pro|Gemini Pro ai_model 92
|
||||
Gemini Flash gemini flash|Gemini 3 Flash|Gemini 2.5 Flash ai_model 88
|
||||
DeepSeek V3 deepseek v three|DeepSeek-V3 ai_model 92
|
||||
DeepSeek R1 deepseek r one|DeepSeek-R1 ai_model 95
|
||||
DeepSeek V4 deepseek v four|DeepSeek-V4|DeepSeek V4 Pro ai_model 92
|
||||
Qwen Coder qwen coder|千问 coder|通义千问 coder ai_model 90
|
||||
Qwen Max qwen max|Qwen3 Max|通义千问 Max ai_model 88
|
||||
Qwen Thinking qwen thinking|通义千问 thinking ai_model 86
|
||||
Kimi K2 kimi k two|Kimi K2.6|Kimi K2.5 ai_model 90
|
||||
Kimi Code kimi code|Moonshot Kimi Code dev_tool 88
|
||||
GLM Coding Plan glm coding plan|智谱 coding plan dev_tool 84
|
||||
GLM-4.6 glm four six|GLM 4.6 ai_model 84
|
||||
GLM-5 glm five|GLM 5 ai_model 86
|
||||
Grok 4 grok four|Grok 4.3|Grok Build ai_model 86
|
||||
Grok Build grok build|Grok Build CLI dev_tool 84
|
||||
Llama 4 llama four|Llama Maverick|Llama Scout ai_model 86
|
||||
Llama Maverick llama maverick|Llama 4 Maverick ai_model 84
|
||||
Mistral Large mistral large|Mistral Large 3 ai_model 84
|
||||
Devin devin|Cognition Devin dev_tool 88
|
||||
Cognition cognition ai|Cognition AI ai_brand 82
|
||||
Kiro kiro|Amazon Kiro dev_tool 84
|
||||
Amazon Q amazon q|AWS Q|Q Developer dev_tool 84
|
||||
Q Developer q developer|Amazon Q Developer dev_tool 82
|
||||
OpenCode open code|opencode|OpenCode AI dev_tool 88
|
||||
OpenHands open hands|OpenHands AI dev_tool 84
|
||||
Roo Code roo code|RooCode dev_tool 80
|
||||
Continue continue dev|Continue.dev dev_tool 78
|
||||
Zed zed editor|Zed AI dev_tool 80
|
||||
Trae trae|Trae AI|Trae CN dev_tool 84
|
||||
TRAE trae|字节 Trae dev_tool 82
|
||||
Lovable lovable|Lovable AI dev_tool 84
|
||||
Bolt.new bolt new|Bolt AI|StackBlitz Bolt dev_tool 84
|
||||
v0 vercel v0|v zero|V0 dev_tool 86
|
||||
Replit Agent replit agent|Replit AI dev_tool 84
|
||||
Manus manus|Manus AI ai_brand 86
|
||||
AutoGen autogen|Microsoft AutoGen ai_platform 82
|
||||
CrewAI crew ai|Crew AI ai_platform 82
|
||||
LangGraph lang graph|LangGraph ai_platform 84
|
||||
DSPy dspy|DSPy AI ai_platform 78
|
||||
LlamaIndex llama index|LlamaIndex ai_platform 82
|
||||
Haystack haystack ai|Deepset Haystack ai_platform 76
|
||||
ComfyUI comfy ui|ComfyUI ai_platform 78
|
||||
Fooocus fooocus|Focus AI ai_platform 72
|
||||
LM Studio lm studio|LMStudio ai_platform 82
|
||||
Open WebUI open web ui|OpenWebUI ai_platform 82
|
||||
AnythingLLM anything llm|Anything LLM ai_platform 78
|
||||
|
||||
# --- Agent, MCP & AI engineering terms ---
|
||||
Agent Mode agent mode|代理模式|智能体模式 ai_term 92
|
||||
智能体模式 zhi neng ti mo shi Agent Mode ai_term 90
|
||||
multi-agent multi agent|多智能体 ai_term 90
|
||||
多智能体 duo zhi neng ti multi-agent ai_term 88
|
||||
subagent sub agent|子智能体 ai_term 86
|
||||
子智能体 zi zhi neng ti subagent ai_term 84
|
||||
tool use tool-use|工具使用 ai_term 88
|
||||
tool calling tool-calling|工具调用 ai_term 90
|
||||
structured output structured outputs|结构化输出 ai_term 86
|
||||
结构化输出 jie gou hua shu chu structured output ai_term 84
|
||||
context engineering context engineering|上下文工程 ai_term 92
|
||||
上下文工程 shang xia wen gong cheng context engineering ai_term 90
|
||||
prompt caching prompt cache|提示词缓存 ai_term 84
|
||||
提示词缓存 ti shi ci huan cun prompt caching ai_term 82
|
||||
semantic search 语义搜索|semantic retrieval ai_term 84
|
||||
语义搜索 yu yi sou suo semantic search ai_term 82
|
||||
vector search 向量搜索|vector retrieval ai_term 84
|
||||
向量搜索 xiang liang sou suo vector search ai_term 82
|
||||
hybrid search 混合搜索|hybrid retrieval ai_term 82
|
||||
reranker rerank|重排序模型 ai_term 82
|
||||
重排序模型 chong pai xu mo xing reranker ai_term 80
|
||||
evals evaluation|模型评测|评测集 ai_term 86
|
||||
模型评测 mo xing ping ce evals ai_term 84
|
||||
SWE-agent swe agent|SWE Agent ai_term 80
|
||||
WebDev Arena web dev arena|WebDevArena ai_term 76
|
||||
LLM harness llm harness|agent harness ai_term 80
|
||||
agent harness agentic harness|智能体框架 ai_term 80
|
||||
reasoning effort reasoning effort|推理强度 ai_term 78
|
||||
推理强度 tui li qiang du reasoning effort ai_term 76
|
||||
test-time compute test time compute|测试时计算 ai_term 78
|
||||
上下文压缩 shang xia wen ya suo context compression ai_term 82
|
||||
context compression 上下文压缩 ai_term 80
|
||||
memory bank memory bank|记忆库 ai_term 78
|
||||
AI workflow ai workflow|AI 工作流 ai_term 82
|
||||
工作流编排 gong zuo liu bian pai workflow orchestration ai_term 82
|
||||
workflow orchestration 工作流编排 ai_term 80
|
||||
MCP server mcp server|模型上下文协议服务器 ai_term 90
|
||||
MCP client mcp client|模型上下文协议客户端 ai_term 86
|
||||
MCP Inspector mcp inspector|MCP 调试器 dev_tool 82
|
||||
Streamable HTTP streamable http|MCP HTTP ai_term 78
|
||||
stdio transport stdio transport|标准输入输出传输 ai_term 76
|
||||
|
||||
# --- Developer platforms, databases & infra ---
|
||||
Neon neon database|Neon Postgres tech_company 84
|
||||
PlanetScale planet scale|PlanetScale MySQL tech_company 82
|
||||
Turso turso|libSQL tech_company 80
|
||||
libSQL lib sql|Turso tech_term 78
|
||||
Convex convex dev|Convex database tech_company 80
|
||||
Clerk clerk auth|Clerk dev_tool 80
|
||||
Auth0 auth zero|Auth Zero dev_tool 78
|
||||
WorkOS work os|Work OS dev_tool 78
|
||||
Clerk Auth clerk auth|Clerk dev_tool 78
|
||||
Drizzle drizzle orm|Drizzle ORM dev_tool 82
|
||||
Prisma prisma orm|Prisma ORM dev_tool 84
|
||||
Drizzle ORM drizzle orm|Drizzle dev_tool 82
|
||||
Prisma ORM prisma orm|Prisma dev_tool 82
|
||||
Postgres postgres|PostgreSQL|postgre sql tech_term 88
|
||||
PostgreSQL postgresql|Postgres|postgre sql tech_term 88
|
||||
SQLite sqlite|SQLite tech_term 84
|
||||
DuckDB duck db|Duck DB tech_term 80
|
||||
ClickHouse click house|ClickHouse tech_term 80
|
||||
Kafka kafka|Apache Kafka tech_term 82
|
||||
Redpanda red panda|Redpanda tech_company 76
|
||||
OpenTelemetry open telemetry|OTel tech_term 84
|
||||
OTel otel|OpenTelemetry tech_term 82
|
||||
Grafana grafana dev_tool 78
|
||||
Prometheus prometheus dev_tool 78
|
||||
Sentry sentry dev_tool 82
|
||||
SST sst|Serverless Stack dev_tool 76
|
||||
Tailscale tailscale tech_company 78
|
||||
Fly.io fly io|Fly tech_company 78
|
||||
Render render.com|Render tech_company 76
|
||||
Railway railway app|Railway tech_company 78
|
||||
Modal modal labs|Modal tech_company 78
|
||||
Modal Labs modal labs|Modal tech_company 76
|
||||
Hugging Face Spaces hugging face spaces|Spaces ai_platform 78
|
||||
Nix nix|NixOS tech_term 78
|
||||
NixOS nixos|Nix OS tech_term 76
|
||||
Bun bun js|Bun runtime dev_tool 82
|
||||
Deno deno|Deno Deploy dev_tool 80
|
||||
Biome biome js|Biome dev_tool 78
|
||||
Turborepo turbo repo|Turborepo dev_tool 78
|
||||
Nx nx monorepo|Nx dev_tool 76
|
||||
pnpm pnpm dev_tool 76
|
||||
shadcn/ui shadcn ui|shadcn|shad cn dev_tool 84
|
||||
Tailwind CSS tailwind css|Tailwind dev_tool 84
|
||||
React Server Components react server components|RSC dev_tool 82
|
||||
RSC react server components dev_tool 80
|
||||
Server Actions server actions|React Server Actions dev_tool 78
|
||||
Astro astro js|Astro dev_tool 80
|
||||
SvelteKit svelte kit|SvelteKit dev_tool 80
|
||||
Remix remix run|Remix dev_tool 78
|
||||
Nuxt nuxt|Nuxt.js dev_tool 78
|
||||
Hono hono js|Hono dev_tool 78
|
||||
FastAPI fast api|FastAPI dev_tool 82
|
||||
Ktor ktor|Ktor server dev_tool 76
|
||||
|
||||
# --- Apple, Swift & on-device speech stack ---
|
||||
SwiftData swift data|SwiftData dev_tool 88
|
||||
Swift Testing swift testing|Testing framework dev_tool 86
|
||||
App Intents app intents|AppIntents dev_tool 84
|
||||
WidgetKit widget kit|WidgetKit dev_tool 82
|
||||
ActivityKit activity kit|ActivityKit dev_tool 82
|
||||
Live Activities live activities|灵动岛实时活动 dev_tool 82
|
||||
App Group app group|App Groups dev_tool 86
|
||||
Core ML core ml|CoreML dev_tool 88
|
||||
Create ML create ml|CreateML dev_tool 82
|
||||
SpeechAnalyzer speech analyzer|Speech Analyzer dev_tool 92
|
||||
DictationTranscriber dictation transcriber|Dictation Transcriber dev_tool 92
|
||||
SpeechTranscriber speech transcriber|Speech Transcriber dev_tool 86
|
||||
SFCustomLanguageModelData custom language model data|SF Custom Language Model Data dev_tool 90
|
||||
SFSpeechLanguageModel speech language model|SF Speech Language Model dev_tool 88
|
||||
AssetInventory asset inventory|Speech AssetInventory dev_tool 84
|
||||
AVAudioEngine av audio engine|AVAudioEngine dev_tool 84
|
||||
AVAudioSession av audio session|AVAudioSession dev_tool 84
|
||||
TestFlight test flight|TestFlight dev_tool 84
|
||||
App Store Connect app store connect|AppStoreConnect dev_tool 84
|
||||
XcodeGen xcode gen|XcodeGen dev_tool 82
|
||||
Tuist tuist dev_tool 78
|
||||
Swift Package Manager swift package manager|SPM dev_tool 82
|
||||
SPM swift package manager dev_tool 80
|
||||
SF Symbols sf symbols|SFSymbols dev_tool 82
|
||||
visionOS vision os|Vision Pro dev_tool 82
|
||||
RealityKit reality kit|RealityKit dev_tool 80
|
||||
Metal metal|Metal Performance Shaders dev_tool 80
|
||||
|
||||
# --- China AI, creator tools & current tech buzzwords ---
|
||||
可灵 ke ling Kling|Kling AI ai_brand 86
|
||||
Kling kling ai|可灵 ai_brand 86
|
||||
海螺AI hai luo AI Hailuo|MiniMax Video ai_brand 84
|
||||
Hailuo hailuo ai|海螺AI ai_brand 82
|
||||
即梦 ji meng Jimeng|即梦AI ai_brand 84
|
||||
Jimeng jimeng ai|即梦 ai_brand 82
|
||||
剪映 jian ying CapCut tech_company 84
|
||||
CapCut cap cut|剪映 tech_company 84
|
||||
腾讯元宝 teng xun yuan bao Yuanbao ai_brand 84
|
||||
元宝 yuan bao 腾讯元宝|Yuanbao ai_brand 82
|
||||
纳米AI na mi AI Nami AI ai_brand 78
|
||||
秘塔AI mi ta AI Metaso ai_brand 80
|
||||
Metaso metaso|秘塔AI ai_brand 78
|
||||
夸克AI kua ke AI Quark AI ai_brand 80
|
||||
Quark quark ai|夸克 ai_brand 78
|
||||
天工 tian gong tiangong|昆仑万维天工 ai_brand 78
|
||||
商量 shang liang SenseChat ai_brand 76
|
||||
杭州六小龙 hang zhou liu xiao long Hangzhou Six Little Dragons tech_term 84
|
||||
AI治理 AI zhi li AI governance tech_term 84
|
||||
AI governance AI治理 tech_term 82
|
||||
世界模型 shi jie mo xing world model ai_term 84
|
||||
world model 世界模型 ai_term 82
|
||||
端到端 duan dao duan end-to-end tech_term 82
|
||||
end-to-end 端到端 tech_term 80
|
||||
端侧模型 duan ce mo xing on-device model ai_term 84
|
||||
on-device model 端侧模型 ai_term 82
|
||||
本地模型 ben di mo xing local model ai_term 84
|
||||
local model 本地模型 ai_term 82
|
||||
具身智能体 ju shen zhi neng ti embodied agent ai_term 82
|
||||
embodied agent 具身智能体 ai_term 80
|
||||
人形机器人 ren xing ji qi ren humanoid robot|humanoid tech_term 86
|
||||
humanoid robot 人形机器人 tech_term 84
|
||||
新质生产力 xin zhi sheng chan li new quality productive forces tech_term 82
|
||||
数字分身 shu zi fen shen digital avatar tech_term 78
|
||||
digital avatar 数字分身 tech_term 76
|
||||
AI视频 AI shi pin AI video tech_term 82
|
||||
AI video AI视频 tech_term 80
|
||||
文生图 wen sheng tu text-to-image tech_term 82
|
||||
图生视频 tu sheng shi pin image-to-video tech_term 82
|
||||
文生视频 wen sheng shi pin text-to-video tech_term 82
|
||||
小红书 xiao hong shu Xiaohongshu|RedNote tech_company 86
|
||||
Xiaohongshu xiao hong shu|小红书|RedNote tech_company 84
|
||||
RedNote red note|Xiaohongshu|小红书 tech_company 82
|
||||
活人感 huo ren gan authentically human|real person vibe tech_term 80
|
||||
情绪价值 qing xu jia zhi emotional value tech_term 80
|
||||
赛博对账 sai bo dui zhang cyber reconciliation tech_term 78
|
||||
赛博 sai bo cyber tech_term 76
|
||||
村咖 cun ka village coffee tech_term 72
|
||||
拉布布 la bu bu Labubu tech_term 72
|
||||
Labubu labubu|拉布布 tech_term 72
|
||||
|
||||
|
Reference in New Issue
Block a user