homegraph 1.2.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -11
- package/dist/bin/homegraph.js +298 -72
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +117 -11
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts +207 -6
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +461 -20
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +19 -1
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +157 -3
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +426 -9
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +32 -1
- package/dist/db/sqlite-adapter.d.ts +24 -17
- package/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/dist/db/sqlite-adapter.js +292 -36
- package/dist/db/sqlite-adapter.js.map +1 -1
- package/dist/db/wal-valve.d.ts +119 -0
- package/dist/db/wal-valve.d.ts.map +1 -0
- package/dist/db/wal-valve.js +290 -0
- package/dist/db/wal-valve.js.map +1 -0
- package/dist/directory.d.ts +9 -5
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +210 -19
- package/dist/directory.js.map +1 -1
- package/dist/extraction/arkts-batch-worker.js +3 -2
- package/dist/extraction/arkts-batch-worker.js.map +1 -1
- package/dist/extraction/cfml-extractor.d.ts +107 -0
- package/dist/extraction/cfml-extractor.d.ts.map +1 -0
- package/dist/extraction/cfml-extractor.js +494 -0
- package/dist/extraction/cfml-extractor.js.map +1 -0
- package/dist/extraction/default-ignore.d.ts +39 -0
- package/dist/extraction/default-ignore.d.ts.map +1 -0
- package/dist/extraction/default-ignore.js +221 -0
- package/dist/extraction/default-ignore.js.map +1 -0
- package/dist/extraction/grammars.d.ts +25 -1
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +177 -24
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts +52 -14
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +521 -314
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +90 -6
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +1579 -128
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/languages/c-cpp.d.ts +42 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
- package/dist/extraction/languages/c-cpp.js +369 -4
- package/dist/extraction/languages/c-cpp.js.map +1 -1
- package/dist/extraction/languages/cfquery.d.ts +12 -0
- package/dist/extraction/languages/cfquery.d.ts.map +1 -0
- package/dist/extraction/languages/cfquery.js +28 -0
- package/dist/extraction/languages/cfquery.js.map +1 -0
- package/dist/extraction/languages/cfscript.d.ts +3 -0
- package/dist/extraction/languages/cfscript.d.ts.map +1 -0
- package/dist/extraction/languages/cfscript.js +73 -0
- package/dist/extraction/languages/cfscript.js.map +1 -0
- package/dist/extraction/languages/cobol.d.ts +33 -0
- package/dist/extraction/languages/cobol.d.ts.map +1 -0
- package/dist/extraction/languages/cobol.js +499 -0
- package/dist/extraction/languages/cobol.js.map +1 -0
- package/dist/extraction/languages/erlang.d.ts +3 -0
- package/dist/extraction/languages/erlang.d.ts.map +1 -0
- package/dist/extraction/languages/erlang.js +350 -0
- package/dist/extraction/languages/erlang.js.map +1 -0
- package/dist/extraction/languages/index.d.ts.map +1 -1
- package/dist/extraction/languages/index.js +16 -0
- package/dist/extraction/languages/index.js.map +1 -1
- package/dist/extraction/languages/nix.d.ts +3 -0
- package/dist/extraction/languages/nix.d.ts.map +1 -0
- package/dist/extraction/languages/nix.js +294 -0
- package/dist/extraction/languages/nix.js.map +1 -0
- package/dist/extraction/languages/solidity.d.ts +3 -0
- package/dist/extraction/languages/solidity.d.ts.map +1 -0
- package/dist/extraction/languages/solidity.js +293 -0
- package/dist/extraction/languages/solidity.js.map +1 -0
- package/dist/extraction/languages/terraform.d.ts +3 -0
- package/dist/extraction/languages/terraform.d.ts.map +1 -0
- package/dist/extraction/languages/terraform.js +641 -0
- package/dist/extraction/languages/terraform.js.map +1 -0
- package/dist/extraction/languages/vbnet.d.ts +11 -0
- package/dist/extraction/languages/vbnet.d.ts.map +1 -0
- package/dist/extraction/languages/vbnet.js +141 -0
- package/dist/extraction/languages/vbnet.js.map +1 -0
- package/dist/extraction/mybatis-extractor.d.ts +30 -10
- package/dist/extraction/mybatis-extractor.d.ts.map +1 -1
- package/dist/extraction/mybatis-extractor.js +140 -38
- package/dist/extraction/mybatis-extractor.js.map +1 -1
- package/dist/extraction/parse-pool.d.ts +27 -1
- package/dist/extraction/parse-pool.d.ts.map +1 -1
- package/dist/extraction/parse-pool.js +75 -7
- package/dist/extraction/parse-pool.js.map +1 -1
- package/dist/extraction/parse-worker.js +9 -2
- package/dist/extraction/parse-worker.js.map +1 -1
- package/dist/extraction/store-worker.d.ts +20 -0
- package/dist/extraction/store-worker.d.ts.map +1 -0
- package/dist/extraction/store-worker.js +102 -0
- package/dist/extraction/store-worker.js.map +1 -0
- package/dist/extraction/store-writer.d.ts +48 -0
- package/dist/extraction/store-writer.d.ts.map +1 -0
- package/dist/extraction/store-writer.js +167 -0
- package/dist/extraction/store-writer.js.map +1 -0
- package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
- package/dist/extraction/tree-sitter-helpers.js +1 -0
- package/dist/extraction/tree-sitter-helpers.js.map +1 -1
- package/dist/extraction/tree-sitter-types.d.ts +3 -1
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.d.ts +38 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +801 -10
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-terraform.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
- package/dist/extraction/wasm-runtime-flags.d.ts +14 -4
- package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
- package/dist/extraction/wasm-runtime-flags.js +55 -7
- package/dist/extraction/wasm-runtime-flags.js.map +1 -1
- package/dist/graph/traversal.d.ts.map +1 -1
- package/dist/graph/traversal.js +1 -1
- package/dist/graph/traversal.js.map +1 -1
- package/dist/index.d.ts +74 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +436 -55
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts +42 -0
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +97 -2
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/daemon.d.ts +25 -3
- package/dist/mcp/daemon.d.ts.map +1 -1
- package/dist/mcp/daemon.js +62 -8
- package/dist/mcp/daemon.js.map +1 -1
- package/dist/mcp/dynamic-boundaries.d.ts.map +1 -1
- package/dist/mcp/dynamic-boundaries.js +2 -1
- package/dist/mcp/dynamic-boundaries.js.map +1 -1
- package/dist/mcp/early-ppid.d.ts +26 -0
- package/dist/mcp/early-ppid.d.ts.map +1 -0
- package/dist/mcp/early-ppid.js +29 -0
- package/dist/mcp/early-ppid.js.map +1 -0
- package/dist/mcp/engine.d.ts +4 -5
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +27 -1
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +41 -6
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/liveness-watchdog.d.ts +18 -1
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
- package/dist/mcp/liveness-watchdog.js +73 -13
- package/dist/mcp/liveness-watchdog.js.map +1 -1
- package/dist/mcp/memory-budget.d.ts +30 -0
- package/dist/mcp/memory-budget.d.ts.map +1 -0
- package/dist/mcp/memory-budget.js +123 -0
- package/dist/mcp/memory-budget.js.map +1 -0
- package/dist/mcp/proxy.d.ts.map +1 -1
- package/dist/mcp/proxy.js +88 -4
- package/dist/mcp/proxy.js.map +1 -1
- package/dist/mcp/query-cache.d.ts +35 -4
- package/dist/mcp/query-cache.d.ts.map +1 -1
- package/dist/mcp/query-cache.js +89 -19
- package/dist/mcp/query-cache.js.map +1 -1
- package/dist/mcp/query-pool.d.ts +46 -12
- package/dist/mcp/query-pool.d.ts.map +1 -1
- package/dist/mcp/query-pool.js +100 -23
- package/dist/mcp/query-pool.js.map +1 -1
- package/dist/mcp/query-worker.d.ts +2 -2
- package/dist/mcp/query-worker.js +2 -2
- package/dist/mcp/server-instructions.d.ts +4 -27
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +39 -84
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/session.d.ts +14 -0
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +28 -1
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/startup-handshake.d.ts +44 -0
- package/dist/mcp/startup-handshake.d.ts.map +1 -0
- package/dist/mcp/startup-handshake.js +73 -0
- package/dist/mcp/startup-handshake.js.map +1 -0
- package/dist/mcp/tools.d.ts +104 -4
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +2432 -217
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/transport.d.ts.map +1 -1
- package/dist/mcp/transport.js +18 -0
- package/dist/mcp/transport.js.map +1 -1
- package/dist/project-config.d.ts +38 -0
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +101 -2
- package/dist/project-config.js.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.d.ts +2 -1
- package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.js +178 -146
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +54 -10
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +1299 -257
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/cooperative-yield.d.ts +10 -2
- package/dist/resolution/cooperative-yield.d.ts.map +1 -1
- package/dist/resolution/cooperative-yield.js +6 -4
- package/dist/resolution/cooperative-yield.js.map +1 -1
- package/dist/resolution/frameworks/cics.d.ts +20 -0
- package/dist/resolution/frameworks/cics.d.ts.map +1 -0
- package/dist/resolution/frameworks/cics.js +90 -0
- package/dist/resolution/frameworks/cics.js.map +1 -0
- package/dist/resolution/frameworks/go.d.ts.map +1 -1
- package/dist/resolution/frameworks/go.js +29 -6
- package/dist/resolution/frameworks/go.js.map +1 -1
- package/dist/resolution/frameworks/index.d.ts.map +1 -1
- package/dist/resolution/frameworks/index.js +3 -0
- package/dist/resolution/frameworks/index.js.map +1 -1
- package/dist/resolution/frameworks/java.d.ts.map +1 -1
- package/dist/resolution/frameworks/java.js +14 -6
- package/dist/resolution/frameworks/java.js.map +1 -1
- package/dist/resolution/frameworks/terraform.d.ts +38 -0
- package/dist/resolution/frameworks/terraform.d.ts.map +1 -0
- package/dist/resolution/frameworks/terraform.js +277 -0
- package/dist/resolution/frameworks/terraform.js.map +1 -0
- package/dist/resolution/goframe-synthesizer.d.ts +2 -1
- package/dist/resolution/goframe-synthesizer.d.ts.map +1 -1
- package/dist/resolution/goframe-synthesizer.js +8 -3
- package/dist/resolution/goframe-synthesizer.js.map +1 -1
- package/dist/resolution/import-resolver.d.ts +9 -3
- package/dist/resolution/import-resolver.d.ts.map +1 -1
- package/dist/resolution/import-resolver.js +295 -11
- package/dist/resolution/import-resolver.js.map +1 -1
- package/dist/resolution/index.d.ts +146 -8
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +1089 -131
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/memory-budget.d.ts +48 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -0
- package/dist/resolution/memory-budget.js +162 -0
- package/dist/resolution/memory-budget.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +12 -4
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +793 -130
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/resolution/resolver-pool.d.ts +106 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -0
- package/dist/resolution/resolver-pool.js +344 -0
- package/dist/resolution/resolver-pool.js.map +1 -0
- package/dist/resolution/resolver-worker.d.ts +17 -0
- package/dist/resolution/resolver-worker.d.ts.map +1 -0
- package/dist/resolution/resolver-worker.js +141 -0
- package/dist/resolution/resolver-worker.js.map +1 -0
- package/dist/resolution/strip-comments.d.ts +1 -1
- package/dist/resolution/strip-comments.d.ts.map +1 -1
- package/dist/resolution/strip-comments.js +49 -0
- package/dist/resolution/strip-comments.js.map +1 -1
- package/dist/resolution/types.d.ts +32 -0
- package/dist/resolution/types.d.ts.map +1 -1
- package/dist/resolution/workspace-packages.d.ts +10 -0
- package/dist/resolution/workspace-packages.d.ts.map +1 -1
- package/dist/resolution/workspace-packages.js +142 -4
- package/dist/resolution/workspace-packages.js.map +1 -1
- package/dist/search/identifier-segments.d.ts +60 -0
- package/dist/search/identifier-segments.d.ts.map +1 -0
- package/dist/search/identifier-segments.js +176 -0
- package/dist/search/identifier-segments.js.map +1 -0
- package/dist/search/query-utils.d.ts +201 -0
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +919 -2
- package/dist/search/query-utils.js.map +1 -1
- package/dist/spec/build/diff-parser.d.ts +55 -0
- package/dist/spec/build/diff-parser.d.ts.map +1 -0
- package/dist/spec/build/diff-parser.js +205 -0
- package/dist/spec/build/diff-parser.js.map +1 -0
- package/dist/spec/build/git-scanner.d.ts +93 -0
- package/dist/spec/build/git-scanner.d.ts.map +1 -0
- package/dist/spec/build/git-scanner.js +254 -0
- package/dist/spec/build/git-scanner.js.map +1 -0
- package/dist/spec/build/pipeline.d.ts +54 -0
- package/dist/spec/build/pipeline.d.ts.map +1 -0
- package/dist/spec/build/pipeline.js +170 -0
- package/dist/spec/build/pipeline.js.map +1 -0
- package/dist/spec/build/scan.d.ts +48 -0
- package/dist/spec/build/scan.d.ts.map +1 -0
- package/dist/spec/build/scan.js +89 -0
- package/dist/spec/build/scan.js.map +1 -0
- package/dist/spec/build/scope-resolver.d.ts +50 -0
- package/dist/spec/build/scope-resolver.d.ts.map +1 -0
- package/dist/spec/build/scope-resolver.js +105 -0
- package/dist/spec/build/scope-resolver.js.map +1 -0
- package/dist/spec/build/spec-extractor.d.ts +74 -0
- package/dist/spec/build/spec-extractor.d.ts.map +1 -0
- package/dist/spec/build/spec-extractor.js +344 -0
- package/dist/spec/build/spec-extractor.js.map +1 -0
- package/dist/spec/config.d.ts +35 -1
- package/dist/spec/config.d.ts.map +1 -1
- package/dist/spec/config.js +30 -5
- package/dist/spec/config.js.map +1 -1
- package/dist/spec/db/fts.d.ts.map +1 -1
- package/dist/spec/db/fts.js +19 -50
- package/dist/spec/db/fts.js.map +1 -1
- package/dist/spec/db/index.d.ts +5 -3
- package/dist/spec/db/index.d.ts.map +1 -1
- package/dist/spec/db/index.js +16 -1
- package/dist/spec/db/index.js.map +1 -1
- package/dist/spec/db/persist.d.ts +45 -0
- package/dist/spec/db/persist.d.ts.map +1 -0
- package/dist/spec/db/persist.js +66 -0
- package/dist/spec/db/persist.js.map +1 -0
- package/dist/spec/db/relations.d.ts +80 -1
- package/dist/spec/db/relations.d.ts.map +1 -1
- package/dist/spec/db/relations.js +175 -4
- package/dist/spec/db/relations.js.map +1 -1
- package/dist/spec/db/schema.d.ts +4 -0
- package/dist/spec/db/schema.d.ts.map +1 -1
- package/dist/spec/db/schema.js +4 -0
- package/dist/spec/db/schema.js.map +1 -1
- package/dist/spec/db/schema.sql +5 -1
- package/dist/spec/db/spec-node.d.ts +5 -0
- package/dist/spec/db/spec-node.d.ts.map +1 -1
- package/dist/spec/db/spec-node.js +11 -5
- package/dist/spec/db/spec-node.js.map +1 -1
- package/dist/spec/db/sql-utils.d.ts +11 -0
- package/dist/spec/db/sql-utils.d.ts.map +1 -0
- package/dist/spec/db/sql-utils.js +19 -0
- package/dist/spec/db/sql-utils.js.map +1 -0
- package/dist/spec/evolve/cluster-context.d.ts +30 -0
- package/dist/spec/evolve/cluster-context.d.ts.map +1 -0
- package/dist/spec/evolve/cluster-context.js +78 -0
- package/dist/spec/evolve/cluster-context.js.map +1 -0
- package/dist/spec/evolve/commit-spec-analyzer.d.ts +51 -0
- package/dist/spec/evolve/commit-spec-analyzer.d.ts.map +1 -0
- package/dist/spec/evolve/commit-spec-analyzer.js +88 -0
- package/dist/spec/evolve/commit-spec-analyzer.js.map +1 -0
- package/dist/spec/evolve/commit-spec-persister.d.ts +53 -0
- package/dist/spec/evolve/commit-spec-persister.d.ts.map +1 -0
- package/dist/spec/evolve/commit-spec-persister.js +93 -0
- package/dist/spec/evolve/commit-spec-persister.js.map +1 -0
- package/dist/spec/evolve/impact-locator.d.ts +23 -7
- package/dist/spec/evolve/impact-locator.d.ts.map +1 -1
- package/dist/spec/evolve/impact-locator.js +58 -14
- package/dist/spec/evolve/impact-locator.js.map +1 -1
- package/dist/spec/evolve/pipeline.d.ts +62 -25
- package/dist/spec/evolve/pipeline.d.ts.map +1 -1
- package/dist/spec/evolve/pipeline.js +436 -457
- package/dist/spec/evolve/pipeline.js.map +1 -1
- package/dist/spec/evolve/spec-rewriter.d.ts +13 -13
- package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -1
- package/dist/spec/evolve/spec-rewriter.js +45 -45
- package/dist/spec/evolve/spec-rewriter.js.map +1 -1
- package/dist/spec/git/commits.d.ts +85 -0
- package/dist/spec/git/commits.d.ts.map +1 -0
- package/dist/spec/git/commits.js +218 -0
- package/dist/spec/git/commits.js.map +1 -0
- package/dist/spec/git/exec.d.ts +13 -0
- package/dist/spec/git/exec.d.ts.map +1 -0
- package/dist/spec/git/exec.js +19 -0
- package/dist/spec/git/exec.js.map +1 -0
- package/dist/spec/git/index.d.ts +9 -0
- package/dist/spec/git/index.d.ts.map +1 -0
- package/dist/spec/git/index.js +22 -0
- package/dist/spec/git/index.js.map +1 -0
- package/dist/spec/git-utils.d.ts +8 -0
- package/dist/spec/git-utils.d.ts.map +1 -0
- package/dist/spec/git-utils.js +14 -0
- package/dist/spec/git-utils.js.map +1 -0
- package/dist/spec/graph/index.d.ts +8 -0
- package/dist/spec/graph/index.d.ts.map +1 -0
- package/dist/spec/graph/index.js +17 -0
- package/dist/spec/graph/index.js.map +1 -0
- package/dist/spec/graph/queries.d.ts +6 -35
- package/dist/spec/graph/queries.d.ts.map +1 -1
- package/dist/spec/graph/queries.js +71 -248
- package/dist/spec/graph/queries.js.map +1 -1
- package/dist/spec/llm/agent-client.d.ts +59 -0
- package/dist/spec/llm/agent-client.d.ts.map +1 -0
- package/dist/spec/llm/agent-client.js +213 -0
- package/dist/spec/llm/agent-client.js.map +1 -0
- package/dist/spec/llm/agents/claude-code.d.ts +32 -0
- package/dist/spec/llm/agents/claude-code.d.ts.map +1 -0
- package/dist/spec/llm/agents/claude-code.js +125 -0
- package/dist/spec/llm/agents/claude-code.js.map +1 -0
- package/dist/spec/llm/agents/codex.d.ts +32 -0
- package/dist/spec/llm/agents/codex.d.ts.map +1 -0
- package/dist/spec/llm/agents/codex.js +145 -0
- package/dist/spec/llm/agents/codex.js.map +1 -0
- package/dist/spec/llm/agents/detect-utils.d.ts +28 -0
- package/dist/spec/llm/agents/detect-utils.d.ts.map +1 -0
- package/dist/spec/llm/agents/detect-utils.js +91 -0
- package/dist/spec/llm/agents/detect-utils.js.map +1 -0
- package/dist/spec/llm/agents/deveco-code.d.ts +33 -0
- package/dist/spec/llm/agents/deveco-code.d.ts.map +1 -0
- package/dist/spec/llm/agents/deveco-code.js +165 -0
- package/dist/spec/llm/agents/deveco-code.js.map +1 -0
- package/dist/spec/llm/agents/index.d.ts +31 -0
- package/dist/spec/llm/agents/index.d.ts.map +1 -0
- package/dist/spec/llm/agents/index.js +65 -0
- package/dist/spec/llm/agents/index.js.map +1 -0
- package/dist/spec/llm/agents/types.d.ts +76 -0
- package/dist/spec/llm/agents/types.d.ts.map +1 -0
- package/dist/spec/llm/agents/types.js +15 -0
- package/dist/spec/llm/agents/types.js.map +1 -0
- package/dist/spec/llm/client.d.ts +31 -11
- package/dist/spec/llm/client.d.ts.map +1 -1
- package/dist/spec/llm/client.js +143 -81
- package/dist/spec/llm/client.js.map +1 -1
- package/dist/spec/llm/factory.d.ts +41 -0
- package/dist/spec/llm/factory.d.ts.map +1 -0
- package/dist/spec/llm/factory.js +80 -0
- package/dist/spec/llm/factory.js.map +1 -0
- package/dist/spec/llm/prompts.d.ts +24 -8
- package/dist/spec/llm/prompts.d.ts.map +1 -1
- package/dist/spec/llm/prompts.js +100 -50
- package/dist/spec/llm/prompts.js.map +1 -1
- package/dist/spec/llm/retry.d.ts +53 -0
- package/dist/spec/llm/retry.d.ts.map +1 -0
- package/dist/spec/llm/retry.js +153 -0
- package/dist/spec/llm/retry.js.map +1 -0
- package/dist/spec/mine/clusterer.d.ts +63 -0
- package/dist/spec/mine/clusterer.d.ts.map +1 -0
- package/dist/spec/mine/clusterer.js +904 -0
- package/dist/spec/mine/clusterer.js.map +1 -0
- package/dist/spec/mine/clustering/features.d.ts +38 -0
- package/dist/spec/mine/clustering/features.d.ts.map +1 -0
- package/dist/spec/mine/clustering/features.js +108 -0
- package/dist/spec/mine/clustering/features.js.map +1 -0
- package/dist/spec/mine/clustering/index.d.ts +62 -0
- package/dist/spec/mine/clustering/index.d.ts.map +1 -0
- package/dist/spec/mine/clustering/index.js +259 -0
- package/dist/spec/mine/clustering/index.js.map +1 -0
- package/dist/spec/mine/clustering/leiden.d.ts +61 -0
- package/dist/spec/mine/clustering/leiden.d.ts.map +1 -0
- package/dist/spec/mine/clustering/leiden.js +489 -0
- package/dist/spec/mine/clustering/leiden.js.map +1 -0
- package/dist/spec/mine/clustering/text-similarity.d.ts +22 -0
- package/dist/spec/mine/clustering/text-similarity.d.ts.map +1 -0
- package/dist/spec/mine/clustering/text-similarity.js +98 -0
- package/dist/spec/mine/clustering/text-similarity.js.map +1 -0
- package/dist/spec/mine/generator.d.ts +54 -0
- package/dist/spec/mine/generator.d.ts.map +1 -0
- package/dist/spec/mine/generator.js +267 -0
- package/dist/spec/mine/generator.js.map +1 -0
- package/dist/spec/mine/persist.d.ts +37 -0
- package/dist/spec/mine/persist.d.ts.map +1 -0
- package/dist/spec/mine/persist.js +170 -0
- package/dist/spec/mine/persist.js.map +1 -0
- package/dist/spec/mine/pipeline.d.ts +41 -0
- package/dist/spec/mine/pipeline.d.ts.map +1 -0
- package/dist/spec/mine/pipeline.js +236 -0
- package/dist/spec/mine/pipeline.js.map +1 -0
- package/dist/spec/mine/progress-handler.d.ts +22 -0
- package/dist/spec/mine/progress-handler.d.ts.map +1 -0
- package/dist/spec/mine/progress-handler.js +108 -0
- package/dist/spec/mine/progress-handler.js.map +1 -0
- package/dist/spec/mine/progress.d.ts +23 -0
- package/dist/spec/mine/progress.d.ts.map +1 -0
- package/dist/spec/mine/progress.js +12 -0
- package/dist/spec/mine/progress.js.map +1 -0
- package/dist/spec/mine/scanner.d.ts +59 -0
- package/dist/spec/mine/scanner.d.ts.map +1 -0
- package/dist/spec/mine/scanner.js +383 -0
- package/dist/spec/mine/scanner.js.map +1 -0
- package/dist/spec/types.d.ts +32 -0
- package/dist/spec/types.d.ts.map +1 -1
- package/dist/spec/ui/index.d.ts +9 -0
- package/dist/spec/ui/index.d.ts.map +1 -0
- package/dist/spec/ui/index.js +16 -0
- package/dist/spec/ui/index.js.map +1 -0
- package/dist/spec/ui/progress-handler.d.ts +33 -0
- package/dist/spec/ui/progress-handler.d.ts.map +1 -0
- package/dist/spec/ui/progress-handler.js +132 -0
- package/dist/spec/ui/progress-handler.js.map +1 -0
- package/dist/spec/ui/progress.d.ts +24 -0
- package/dist/spec/ui/progress.d.ts.map +1 -0
- package/dist/spec/ui/progress.js +13 -0
- package/dist/spec/ui/progress.js.map +1 -0
- package/dist/spec/utils/fs.d.ts +45 -0
- package/dist/spec/utils/fs.d.ts.map +1 -0
- package/dist/spec/utils/fs.js +163 -0
- package/dist/spec/utils/fs.js.map +1 -0
- package/dist/spec/utils/index.d.ts +12 -0
- package/dist/spec/utils/index.d.ts.map +1 -0
- package/dist/spec/utils/index.js +26 -0
- package/dist/spec/utils/index.js.map +1 -0
- package/dist/spec/utils/meta.d.ts +32 -0
- package/dist/spec/utils/meta.d.ts.map +1 -0
- package/dist/spec/utils/meta.js +122 -0
- package/dist/spec/utils/meta.js.map +1 -0
- package/dist/spec/utils/truncate.d.ts +86 -0
- package/dist/spec/utils/truncate.d.ts.map +1 -0
- package/dist/spec/utils/truncate.js +172 -0
- package/dist/spec/utils/truncate.js.map +1 -0
- package/dist/spec/utils.d.ts +4 -16
- package/dist/spec/utils.d.ts.map +1 -1
- package/dist/spec/utils.js +6 -58
- package/dist/spec/utils.js.map +1 -1
- package/dist/sync/git-hooks.d.ts.map +1 -1
- package/dist/sync/git-hooks.js +2 -0
- package/dist/sync/git-hooks.js.map +1 -1
- package/dist/sync/watcher.d.ts +35 -6
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +127 -17
- package/dist/sync/watcher.js.map +1 -1
- package/dist/sync/worktree.d.ts.map +1 -1
- package/dist/sync/worktree.js +5 -0
- package/dist/sync/worktree.js.map +1 -1
- package/dist/telemetry/index.js +3 -3
- package/dist/telemetry/index.js.map +1 -1
- package/dist/types.d.ts +22 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/dist/upgrade/index.d.ts +32 -0
- package/dist/upgrade/index.d.ts.map +1 -1
- package/dist/upgrade/index.js +162 -14
- package/dist/upgrade/index.js.map +1 -1
- package/dist/upgrade/remove-binary.d.ts +87 -0
- package/dist/upgrade/remove-binary.d.ts.map +1 -0
- package/dist/upgrade/remove-binary.js +289 -0
- package/dist/upgrade/remove-binary.js.map +1 -0
- package/dist/upgrade/update-check.d.ts +92 -0
- package/dist/upgrade/update-check.d.ts.map +1 -0
- package/dist/upgrade/update-check.js +258 -0
- package/dist/upgrade/update-check.js.map +1 -0
- package/package.json +6 -2
- package/scripts/agent-eval/run-all.sh +6 -0
- package/scripts/build-bundle.sh +5 -0
- package/scripts/npm-shim.js +8 -1
- package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/data/agents.json +0 -109
- package/scripts/exp_boundary_eval/data/experiments.json +0 -140
- package/scripts/qa_eval/README.md +0 -407
- package/scripts/qa_eval/_test_deveco_probe.py +0 -41
- package/scripts/qa_eval/agent_runner.py +0 -526
- package/scripts/qa_eval/data/.gitignore +0 -4
- package/scripts/qa_eval/data/test-set.jsonl +0 -2
- package/scripts/qa_eval/eval_metrics.py +0 -274
- package/scripts/qa_eval/external_agent.py +0 -976
- package/scripts/qa_eval/llm_config.py +0 -92
- package/scripts/qa_eval/memory_monitor.py +0 -132
- package/scripts/qa_eval/my_answer_accuracy.py +0 -187
- package/scripts/qa_eval/requirements.txt +0 -2
- package/scripts/qa_eval/run_pipeline.py +0 -804
- package/scripts/qa_eval/stats_efficiency.py +0 -279
- package/scripts/qa_eval/stats_scores.py +0 -207
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"""LLM provider presets for qa_eval (DashScope Qwen / 智谱 Zhipu)."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
from dataclasses import dataclass
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@dataclass(frozen=True)
|
|
10
|
-
class LlmConfig:
|
|
11
|
-
provider: str
|
|
12
|
-
api_key: str
|
|
13
|
-
base_url: str
|
|
14
|
-
model: str
|
|
15
|
-
extra_body: dict | None
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
PROVIDER_DASHSCOPE = "dashscope"
|
|
19
|
-
PROVIDER_ZHIPU = "zhipu"
|
|
20
|
-
|
|
21
|
-
_PRESETS: dict[str, dict] = {
|
|
22
|
-
PROVIDER_DASHSCOPE: {
|
|
23
|
-
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
24
|
-
"model": "qwen3-235b-a22b-instruct-2507",
|
|
25
|
-
"api_key_envs": ("DASHSCOPE_API_KEY", "OPENAI_API_KEY"),
|
|
26
|
-
"extra_body": {"enable_thinking": False},
|
|
27
|
-
},
|
|
28
|
-
PROVIDER_ZHIPU: {
|
|
29
|
-
"base_url": "https://open.bigmodel.cn/api/paas/v4/",
|
|
30
|
-
"model": "glm-4-flash",
|
|
31
|
-
"api_key_envs": ("ZHIPU_API_KEY", "ZAI_API_KEY", "OPENAI_API_KEY"),
|
|
32
|
-
"extra_body": None,
|
|
33
|
-
},
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def _read_key(env_names: tuple[str, ...]) -> str | None:
|
|
38
|
-
for name in env_names:
|
|
39
|
-
val = os.environ.get(name, "").strip()
|
|
40
|
-
if val:
|
|
41
|
-
return val
|
|
42
|
-
return None
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def detect_provider() -> str:
|
|
46
|
-
"""Prefer explicit ZHIPU key over DashScope when both are set."""
|
|
47
|
-
if _read_key(_PRESETS[PROVIDER_ZHIPU]["api_key_envs"]):
|
|
48
|
-
return PROVIDER_ZHIPU
|
|
49
|
-
if _read_key(_PRESETS[PROVIDER_DASHSCOPE]["api_key_envs"]):
|
|
50
|
-
return PROVIDER_DASHSCOPE
|
|
51
|
-
return PROVIDER_DASHSCOPE
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def resolve_llm_config(
|
|
55
|
-
*,
|
|
56
|
-
provider: str | None = None,
|
|
57
|
-
model: str | None = None,
|
|
58
|
-
base_url: str | None = None,
|
|
59
|
-
) -> LlmConfig:
|
|
60
|
-
name = (provider or detect_provider()).strip().lower()
|
|
61
|
-
if name not in _PRESETS:
|
|
62
|
-
known = ", ".join(_PRESETS)
|
|
63
|
-
raise ValueError(f"未知 LLM provider: {provider!r},可选: {known}")
|
|
64
|
-
|
|
65
|
-
preset = _PRESETS[name]
|
|
66
|
-
api_key = _read_key(preset["api_key_envs"])
|
|
67
|
-
if not api_key:
|
|
68
|
-
env_hint = " / ".join(preset["api_key_envs"])
|
|
69
|
-
raise RuntimeError(
|
|
70
|
-
f"未找到 {name} 的 API Key。请设置环境变量: {env_hint}\n"
|
|
71
|
-
f" 智谱: export ZHIPU_API_KEY='your-id.your-secret'\n"
|
|
72
|
-
f" DashScope: export DASHSCOPE_API_KEY='sk-...'"
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
# Strip mistaken sk- prefix on Zhipu keys (id.secret format).
|
|
76
|
-
if name == PROVIDER_ZHIPU and api_key.startswith("sk-") and "." in api_key[3:]:
|
|
77
|
-
api_key = api_key[3:]
|
|
78
|
-
|
|
79
|
-
return LlmConfig(
|
|
80
|
-
provider=name,
|
|
81
|
-
api_key=api_key,
|
|
82
|
-
base_url=(base_url or preset["base_url"]).rstrip("/") + "/",
|
|
83
|
-
model=model or preset["model"],
|
|
84
|
-
extra_body=preset["extra_body"],
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def provider_help() -> str:
|
|
89
|
-
return (
|
|
90
|
-
f"dashscope (默认 Qwen, { _PRESETS[PROVIDER_DASHSCOPE]['model']}) | "
|
|
91
|
-
f"zhipu (智谱, 默认 { _PRESETS[PROVIDER_ZHIPU]['model']})"
|
|
92
|
-
)
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"""Sample RSS for a process tree (Linux /proc). Used by qa_eval Agent runs."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
import sys
|
|
7
|
-
import threading
|
|
8
|
-
import time
|
|
9
|
-
from contextlib import contextmanager
|
|
10
|
-
from statistics import mean
|
|
11
|
-
|
|
12
|
-
_PROC_AVAILABLE = sys.platform == "linux" and os.path.isdir("/proc")
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def memory_sampling_supported() -> bool:
|
|
16
|
-
"""True when process-tree RSS sampling is available (Linux /proc)."""
|
|
17
|
-
return _PROC_AVAILABLE
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def _read_rss_kb(pid: int) -> int:
|
|
21
|
-
if not _PROC_AVAILABLE:
|
|
22
|
-
return 0
|
|
23
|
-
try:
|
|
24
|
-
with open(f"/proc/{pid}/status", encoding="utf-8") as f:
|
|
25
|
-
for line in f:
|
|
26
|
-
if line.startswith("VmRSS:"):
|
|
27
|
-
return int(line.split()[1])
|
|
28
|
-
except OSError:
|
|
29
|
-
return 0
|
|
30
|
-
return 0
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def _build_ppid_map() -> dict[int, list[int]]:
|
|
34
|
-
children: dict[int, list[int]] = {}
|
|
35
|
-
if not _PROC_AVAILABLE:
|
|
36
|
-
return children
|
|
37
|
-
try:
|
|
38
|
-
proc_entries = os.listdir("/proc")
|
|
39
|
-
except OSError:
|
|
40
|
-
return children
|
|
41
|
-
for name in proc_entries:
|
|
42
|
-
if not name.isdigit():
|
|
43
|
-
continue
|
|
44
|
-
pid = int(name)
|
|
45
|
-
try:
|
|
46
|
-
with open(f"/proc/{pid}/stat", encoding="utf-8") as f:
|
|
47
|
-
stat = f.read()
|
|
48
|
-
# comm may contain ')'; ppid follows closing paren + space
|
|
49
|
-
after = stat.rsplit(")", 1)[1].split()
|
|
50
|
-
ppid = int(after[1])
|
|
51
|
-
except (OSError, IndexError, ValueError):
|
|
52
|
-
continue
|
|
53
|
-
children.setdefault(ppid, []).append(pid)
|
|
54
|
-
return children
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def process_tree_pids(root_pid: int) -> set[int]:
|
|
58
|
-
if root_pid <= 0:
|
|
59
|
-
return set()
|
|
60
|
-
children = _build_ppid_map()
|
|
61
|
-
seen: set[int] = set()
|
|
62
|
-
stack = [root_pid]
|
|
63
|
-
while stack:
|
|
64
|
-
pid = stack.pop()
|
|
65
|
-
if pid in seen:
|
|
66
|
-
continue
|
|
67
|
-
seen.add(pid)
|
|
68
|
-
stack.extend(children.get(pid, []))
|
|
69
|
-
return seen
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def tree_rss_kb(root_pid: int) -> int:
|
|
73
|
-
return sum(_read_rss_kb(pid) for pid in process_tree_pids(root_pid))
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
class MemorySampler:
|
|
77
|
-
"""Background RSS sampler for root_pid and its descendants."""
|
|
78
|
-
|
|
79
|
-
def __init__(self, interval_sec: float = 0.25) -> None:
|
|
80
|
-
self.interval_sec = interval_sec
|
|
81
|
-
self._root_pid = os.getpid()
|
|
82
|
-
self._samples_kb: list[int] = []
|
|
83
|
-
self._stop = threading.Event()
|
|
84
|
-
self._thread: threading.Thread | None = None
|
|
85
|
-
|
|
86
|
-
def start(self, root_pid: int | None = None) -> None:
|
|
87
|
-
self._root_pid = root_pid if root_pid is not None else os.getpid()
|
|
88
|
-
self._samples_kb = []
|
|
89
|
-
self._stop.clear()
|
|
90
|
-
if not _PROC_AVAILABLE:
|
|
91
|
-
self._thread = None
|
|
92
|
-
return
|
|
93
|
-
self._thread = threading.Thread(target=self._loop, daemon=True)
|
|
94
|
-
self._thread.start()
|
|
95
|
-
|
|
96
|
-
def _loop(self) -> None:
|
|
97
|
-
while not self._stop.is_set():
|
|
98
|
-
try:
|
|
99
|
-
self._samples_kb.append(tree_rss_kb(self._root_pid))
|
|
100
|
-
except OSError:
|
|
101
|
-
break
|
|
102
|
-
self._stop.wait(self.interval_sec)
|
|
103
|
-
|
|
104
|
-
@property
|
|
105
|
-
def last_stats(self) -> dict[str, float | None]:
|
|
106
|
-
"""Peak/avg RSS so far (safe to read while sampling is active)."""
|
|
107
|
-
if not self._samples_kb:
|
|
108
|
-
return {"peak_rss_mb": None, "avg_rss_mb": None}
|
|
109
|
-
peak_kb = max(self._samples_kb)
|
|
110
|
-
avg_kb = mean(self._samples_kb)
|
|
111
|
-
return {
|
|
112
|
-
"peak_rss_mb": round(peak_kb / 1024, 2),
|
|
113
|
-
"avg_rss_mb": round(avg_kb / 1024, 2),
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
def stop(self) -> dict[str, float | None]:
|
|
117
|
-
self._stop.set()
|
|
118
|
-
if self._thread:
|
|
119
|
-
self._thread.join(timeout=2.0)
|
|
120
|
-
return self.last_stats
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
@contextmanager
|
|
124
|
-
def sample_memory(root_pid: int | None = None):
|
|
125
|
-
"""Sample process-tree RSS while the wrapped block runs."""
|
|
126
|
-
sampler = MemorySampler()
|
|
127
|
-
pid = root_pid if root_pid is not None else os.getpid()
|
|
128
|
-
sampler.start(pid)
|
|
129
|
-
try:
|
|
130
|
-
yield sampler
|
|
131
|
-
finally:
|
|
132
|
-
sampler.stop()
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
"""LLM-as-Judge Answer Accuracy (0–1), dual-prompt average — standalone, no ragas."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import logging
|
|
6
|
-
import math
|
|
7
|
-
import re
|
|
8
|
-
from dataclasses import dataclass
|
|
9
|
-
|
|
10
|
-
from openai import AsyncOpenAI
|
|
11
|
-
|
|
12
|
-
logger = logging.getLogger(__name__)
|
|
13
|
-
|
|
14
|
-
TEMPLATE_ACCURACY1 = (
|
|
15
|
-
"Instruction: You are an assistant for rating a User Answer given a Question. "
|
|
16
|
-
"The Question is fully answered by the Reference Answer.\n"
|
|
17
|
-
"Focus on whether the User Answer captures the key meaning and intent of the Reference Answer. "
|
|
18
|
-
"Minor wording differences, alternative phrasing, or extra irrelevant information should not lower the rating.\n"
|
|
19
|
-
"Say 5, if the User Answer conveys the same overall meaning and essential content as the Reference Answer.\n"
|
|
20
|
-
"Say 4, if the User Answer is mostly correct, broadly aligned with the Reference Answer, with only small omissions or slight issues.\n"
|
|
21
|
-
"Say 3, if the User Answer is reasonably correct, covering several important aspects of the Reference Answer, even if incomplete.\n"
|
|
22
|
-
"Say 2, if the User Answer shows some overlap, but misses many essential aspects.\n"
|
|
23
|
-
"Say 1, if the User Answer has very little overlap with the Reference Answer.\n"
|
|
24
|
-
"Say 0, if the User Answer does not address the question at all.\n"
|
|
25
|
-
"Do not explain or justify your rating. Your rating must be a single integer 0–5.\n"
|
|
26
|
-
"If the User Answer is empty, the rating is 0.\n"
|
|
27
|
-
"### Question: {query}\n"
|
|
28
|
-
"### {answer0}: {sentence_inference}\n"
|
|
29
|
-
"### {answer1}: {sentence_true}\n"
|
|
30
|
-
"The rating is:\n"
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
TEMPLATE_ACCURACY2 = (
|
|
34
|
-
"I will rate the User Answer in comparison to the Reference Answer for a given Question.\n"
|
|
35
|
-
"The evaluation must focus mainly on whether the User Answer conveys the essential meaning and intent of the Reference Answer. "
|
|
36
|
-
"Minor details, alternative phrasing, or extra content should not strongly affect the rating.\n"
|
|
37
|
-
"If the User Answer is empty, the rating is 0.\n"
|
|
38
|
-
"The scale is 0 to 5:\n"
|
|
39
|
-
"0 = Does not address the question at all\n"
|
|
40
|
-
"1 = Very limited overlap with the Reference Answer\n"
|
|
41
|
-
"2 = Some overlap, but misses many essential aspects\n"
|
|
42
|
-
"3 = Reasonably correct, covers several important aspects but incomplete\n"
|
|
43
|
-
"4 = Mostly correct, broadly aligned with the Reference Answer with only small gaps\n"
|
|
44
|
-
"5 = Fully correct, conveys the same overall meaning and essential content as the Reference Answer\n"
|
|
45
|
-
"I will provide the rating as a single integer 0–5 without explanation.\n\n"
|
|
46
|
-
"Question: {query}\n\n"
|
|
47
|
-
"{answer0}: {sentence_inference}\n\n"
|
|
48
|
-
"{answer1}: {sentence_true}\n\n"
|
|
49
|
-
"Rating: "
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def remove_tool_calls(text: str) -> str:
|
|
54
|
-
"""Strip --- ... --- blocks that contain agent tool invocations before judging."""
|
|
55
|
-
pattern = re.compile(
|
|
56
|
-
r"---\s*[\s\S]*?"
|
|
57
|
-
r"(ReadFile|SearchText|ReadManyFiles|ReadFolder|SemanticSearch|FindFiles|Custom|HomegraphQuery|HomegraphExplore)"
|
|
58
|
-
r"[\s\S]*?---",
|
|
59
|
-
re.MULTILINE,
|
|
60
|
-
)
|
|
61
|
-
cleaned = re.sub(pattern, "", text)
|
|
62
|
-
return re.sub(r"\n{3,}", "\n\n", cleaned).strip()
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def extract_json_blocks_answerbyCOT(text: str) -> str:
|
|
66
|
-
"""Remove redacted_thinking blocks from chain-of-thought model output."""
|
|
67
|
-
cleaned = re.sub(
|
|
68
|
-
r"<think>.*?</think>",
|
|
69
|
-
"",
|
|
70
|
-
text,
|
|
71
|
-
flags=re.DOTALL | re.IGNORECASE,
|
|
72
|
-
)
|
|
73
|
-
return cleaned.strip()
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def process_score(response: str) -> float:
|
|
77
|
-
for i in range(6):
|
|
78
|
-
if str(i) in response.strip():
|
|
79
|
-
return i / 5
|
|
80
|
-
return math.nan
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def average_scores(score0: float, score1: float) -> float:
|
|
84
|
-
if not math.isnan(score0) and not math.isnan(score1):
|
|
85
|
-
return (score0 + score1) / 2
|
|
86
|
-
if math.isnan(score0) and math.isnan(score1):
|
|
87
|
-
return math.nan
|
|
88
|
-
return score0 if math.isnan(score1) else score1
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
@dataclass
|
|
92
|
-
class MyAnswerAccuracy:
|
|
93
|
-
"""Dual-template LLM judge; scores normalized to 0–1."""
|
|
94
|
-
|
|
95
|
-
client: AsyncOpenAI
|
|
96
|
-
model: str
|
|
97
|
-
retry: int = 5
|
|
98
|
-
extra_body: dict | None = None
|
|
99
|
-
|
|
100
|
-
@classmethod
|
|
101
|
-
def create(
|
|
102
|
-
cls,
|
|
103
|
-
*,
|
|
104
|
-
api_key: str,
|
|
105
|
-
base_url: str,
|
|
106
|
-
model: str,
|
|
107
|
-
timeout_sec: float = 1800,
|
|
108
|
-
extra_body: dict | None = None,
|
|
109
|
-
) -> MyAnswerAccuracy:
|
|
110
|
-
client = AsyncOpenAI(api_key=api_key, base_url=base_url, timeout=timeout_sec)
|
|
111
|
-
return cls(client=client, model=model, extra_body=extra_body)
|
|
112
|
-
|
|
113
|
-
async def _chat(self, prompt: str) -> str:
|
|
114
|
-
kwargs: dict = {
|
|
115
|
-
"model": self.model,
|
|
116
|
-
"messages": [{"role": "user", "content": prompt}],
|
|
117
|
-
"temperature": 0.10,
|
|
118
|
-
}
|
|
119
|
-
if self.extra_body:
|
|
120
|
-
kwargs["extra_body"] = self.extra_body
|
|
121
|
-
resp = await self.client.chat.completions.create(**kwargs)
|
|
122
|
-
return (resp.choices[0].message.content or "").strip()
|
|
123
|
-
|
|
124
|
-
async def _rate(self, prompt: str) -> float:
|
|
125
|
-
for attempt in range(self.retry):
|
|
126
|
-
try:
|
|
127
|
-
text = await self._chat(prompt)
|
|
128
|
-
score = process_score(text)
|
|
129
|
-
if not math.isnan(score):
|
|
130
|
-
return score
|
|
131
|
-
except Exception as e:
|
|
132
|
-
logger.warning("Judge call failed (attempt %s): %s", attempt + 1, e)
|
|
133
|
-
logger.warning("Judge retry (invalid rating): %s", attempt + 1)
|
|
134
|
-
return math.nan
|
|
135
|
-
|
|
136
|
-
async def single_turn_ascore(
|
|
137
|
-
self,
|
|
138
|
-
*,
|
|
139
|
-
user_input: str,
|
|
140
|
-
response: str,
|
|
141
|
-
reference: str,
|
|
142
|
-
) -> float:
|
|
143
|
-
prompt1 = TEMPLATE_ACCURACY1.format(
|
|
144
|
-
query=user_input,
|
|
145
|
-
answer0="User Answer",
|
|
146
|
-
answer1="Reference Answer",
|
|
147
|
-
sentence_inference=response,
|
|
148
|
-
sentence_true=reference,
|
|
149
|
-
)
|
|
150
|
-
prompt2 = TEMPLATE_ACCURACY2.format(
|
|
151
|
-
query=user_input,
|
|
152
|
-
answer0="Reference Answer",
|
|
153
|
-
answer1="User Answer",
|
|
154
|
-
sentence_inference=reference,
|
|
155
|
-
sentence_true=response,
|
|
156
|
-
)
|
|
157
|
-
try:
|
|
158
|
-
s0 = await self._rate(prompt1)
|
|
159
|
-
s1 = await self._rate(prompt2)
|
|
160
|
-
return average_scores(s0, s1)
|
|
161
|
-
except Exception as e:
|
|
162
|
-
logger.warning("Judge error: %s", e)
|
|
163
|
-
return math.nan
|
|
164
|
-
|
|
165
|
-
async def evaluate_answer_accuracy_single(self, sample_data: dict) -> dict:
|
|
166
|
-
result = sample_data.copy()
|
|
167
|
-
try:
|
|
168
|
-
raw = str(sample_data.get("output_answer", ""))
|
|
169
|
-
raw = extract_json_blocks_answerbyCOT(raw)
|
|
170
|
-
response = remove_tool_calls(raw)
|
|
171
|
-
score = await self.single_turn_ascore(
|
|
172
|
-
user_input=str(sample_data.get("query", "")),
|
|
173
|
-
response=response,
|
|
174
|
-
reference=str(sample_data.get("reference_answer", "")),
|
|
175
|
-
)
|
|
176
|
-
result["answer_accuracy_score"] = float(score) if not math.isnan(score) else 0.0
|
|
177
|
-
result["evaluation_status"] = "success" if not math.isnan(score) else "failed"
|
|
178
|
-
if math.isnan(score):
|
|
179
|
-
result["error_message"] = "Judge 未返回有效 0–5 分数"
|
|
180
|
-
except Exception as e:
|
|
181
|
-
logger.error("评估答案准确性时出错: %s", e)
|
|
182
|
-
result["answer_accuracy_score"] = 0.0
|
|
183
|
-
result["evaluation_status"] = "error"
|
|
184
|
-
result["error_message"] = str(e)
|
|
185
|
-
|
|
186
|
-
result.pop("evaluation", None)
|
|
187
|
-
return result
|