agentengine-sdk-python 0.6.2__py3-none-any.whl → 0.6.9__py3-none-any.whl
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.
- agentengine_sdk_python-0.6.9.dist-info/METADATA +179 -0
- agentengine_sdk_python-0.6.9.dist-info/RECORD +487 -0
- {agentengine_sdk_python-0.6.2.dist-info → agentengine_sdk_python-0.6.9.dist-info}/WHEEL +1 -1
- agentengine_sdk_python-0.6.9.dist-info/entry_points.txt +3 -0
- agentengine_sdk_python-0.6.9.dist-info/licenses/LICENSE +175 -0
- agentengine_sdk_python-0.6.9.dist-info/top_level.txt +2 -0
- ksadk/__init__.py +13 -0
- ksadk/__main__.py +4 -0
- ksadk/a2a/__init__.py +15 -0
- ksadk/a2a/card_builder.py +64 -0
- ksadk/a2a/client.py +309 -0
- ksadk/a2a/executor.py +201 -0
- ksadk/a2a/server.py +79 -0
- ksadk/agents/__init__.py +20 -0
- ksadk/agents/base.py +370 -0
- ksadk/agents/context.py +38 -0
- ksadk/agents/event.py +35 -0
- ksadk/agents/loop_agent.py +71 -0
- ksadk/agents/parallel_agent.py +109 -0
- ksadk/agents/runner_adapter.py +24 -0
- ksadk/agents/sequential_agent.py +34 -0
- ksadk/api/__init__.py +3 -0
- ksadk/api/client.py +2227 -0
- ksadk/builders/__init__.py +20 -0
- ksadk/builders/base.py +66 -0
- ksadk/builders/code_builder.py +1990 -0
- ksadk/builders/container_builder.py +786 -0
- ksadk/builders/framework_requirements.py +59 -0
- ksadk/builders/ks3_uploader.py +389 -0
- ksadk/builders/mcp_builder.py +476 -0
- ksadk/builders/requirements_utils.py +75 -0
- ksadk/cli/__init__.py +531 -0
- ksadk/cli/__main__.py +4 -0
- ksadk/cli/agent_ref.py +204 -0
- ksadk/cli/cmd_a2a.py +167 -0
- ksadk/cli/cmd_agent.py +201 -0
- ksadk/cli/cmd_build.py +270 -0
- ksadk/cli/cmd_completion.py +304 -0
- ksadk/cli/cmd_config.py +758 -0
- ksadk/cli/cmd_create.py +2277 -0
- ksadk/cli/cmd_dashboard.py +900 -0
- ksadk/cli/cmd_deploy.py +704 -0
- ksadk/cli/cmd_destroy.py +345 -0
- ksadk/cli/cmd_files.py +1227 -0
- ksadk/cli/cmd_hermes.py +1259 -0
- ksadk/cli/cmd_invoke.py +1336 -0
- ksadk/cli/cmd_launch.py +564 -0
- ksadk/cli/cmd_mcp.py +1174 -0
- ksadk/cli/cmd_model.py +302 -0
- ksadk/cli/cmd_openclaw.py +3918 -0
- ksadk/cli/cmd_run.py +232 -0
- ksadk/cli/cmd_status.py +588 -0
- ksadk/cli/cmd_version.py +522 -0
- ksadk/cli/cmd_web.py +288 -0
- ksadk/cli/deploy_utils.py +87 -0
- ksadk/cli/dry_run.py +214 -0
- ksadk/cli/env_options.py +82 -0
- ksadk/cli/error_utils.py +525 -0
- ksadk/cli/global_options.py +31 -0
- ksadk/cli/local_runtime.py +97 -0
- ksadk/cli/model_catalog.py +136 -0
- ksadk/cli/network_options.py +410 -0
- ksadk/cli/resource_common.py +621 -0
- ksadk/cli/storage.py +84 -0
- ksadk/cli/ui.py +431 -0
- ksadk/cli/workflow_common.py +552 -0
- ksadk/common/__init__.py +14 -0
- ksadk/common/aicp_env.py +128 -0
- ksadk/common/auth.py +190 -0
- ksadk/common/constants.py +84 -0
- ksadk/common/llm_utils.py +61 -0
- ksadk/configs/__init__.py +61 -0
- ksadk/configs/env_registry.py +342 -0
- ksadk/configs/global_config.py +200 -0
- ksadk/configs/settings.py +706 -0
- ksadk/conversations/__init__.py +95 -0
- ksadk/conversations/attachment_storage.py +379 -0
- ksadk/conversations/attachments.py +774 -0
- ksadk/conversations/compaction_pipeline.py +387 -0
- ksadk/conversations/compaction_prompt.py +128 -0
- ksadk/conversations/context.py +303 -0
- ksadk/conversations/model_context.py +360 -0
- ksadk/conversations/model_options.py +136 -0
- ksadk/conversations/normalize.py +446 -0
- ksadk/conversations/reasoning_markup.py +91 -0
- ksadk/conversations/run_kinds.py +61 -0
- ksadk/conversations/run_status.py +53 -0
- ksadk/conversations/runtime.py +5208 -0
- ksadk/conversations/semantic_summary.py +359 -0
- ksadk/conversations/session_title.py +254 -0
- ksadk/deployment/__init__.py +83 -0
- ksadk/deployment/agent_access.py +226 -0
- ksadk/deployment/base.py +229 -0
- ksadk/deployment/manager.py +332 -0
- ksadk/deployment/providers/__init__.py +10 -0
- ksadk/deployment/providers/serverless.py +1105 -0
- ksadk/deployment/registry.py +120 -0
- ksadk/deployment/state.py +78 -0
- ksadk/deployment/ui_config.py +21 -0
- ksadk/detection/__init__.py +7 -0
- ksadk/detection/detector.py +431 -0
- ksadk/detection/mcp_detector.py +250 -0
- ksadk/hermes_terminal.py +467 -0
- ksadk/identity/__init__.py +17 -0
- ksadk/identity/resolver.py +385 -0
- ksadk/knowledge_base/__init__.py +62 -0
- ksadk/knowledge_base/adk_tool.py +47 -0
- ksadk/knowledge_base/client.py +297 -0
- ksadk/knowledge_base/langchain_tool.py +55 -0
- ksadk/knowledge_base/service.py +66 -0
- ksadk/knowledge_base/tool.py +50 -0
- ksadk/markdown.py +169 -0
- ksadk/mcp_runtime/__init__.py +231 -0
- ksadk/memory/__init__.py +57 -0
- ksadk/memory/adk/__init__.py +51 -0
- ksadk/memory/adk/backends/__init__.py +5 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
- ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
- ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
- ksadk/memory/adk/long_term_memory.py +273 -0
- ksadk/memory/adk/short_term_memory.py +289 -0
- ksadk/memory/adk_tool.py +31 -0
- ksadk/memory/backends/__init__.py +6 -0
- ksadk/memory/backends/base.py +103 -0
- ksadk/memory/backends/memory.py +112 -0
- ksadk/memory/backends/redis.py +146 -0
- ksadk/memory/langchain_tool.py +39 -0
- ksadk/memory/ltm_backend_factory.py +24 -0
- ksadk/memory/manager.py +215 -0
- ksadk/memory/service.py +172 -0
- ksadk/memory/tool.py +96 -0
- ksadk/model_policy.py +223 -0
- ksadk/openclaw_gateway.py +378 -0
- ksadk/runners/__init__.py +8 -0
- ksadk/runners/adk_runner.py +1135 -0
- ksadk/runners/base_runner.py +305 -0
- ksadk/runners/deepagents_runner.py +13 -0
- ksadk/runners/factory.py +73 -0
- ksadk/runners/langchain_runner.py +539 -0
- ksadk/runners/langgraph_runner.py +852 -0
- ksadk/runners/patch_langchain.py +187 -0
- ksadk/runners/remote_runner.py +667 -0
- ksadk/runners/usage_accumulator.py +38 -0
- ksadk/runners/utils/__init__.py +19 -0
- ksadk/runners/utils/langfuse.py +230 -0
- ksadk/runners/utils/loader.py +62 -0
- ksadk/runtime_context.py +166 -0
- ksadk/runtime_state.py +25 -0
- ksadk/sandbox/__init__.py +28 -0
- ksadk/sandbox/backends/__init__.py +9 -0
- ksadk/sandbox/backends/e2b.py +154 -0
- ksadk/sandbox/backends/local_process.py +131 -0
- ksadk/sandbox/base.py +101 -0
- ksadk/sandbox/factory.py +53 -0
- ksadk/sandbox/registry.py +187 -0
- ksadk/server/__init__.py +7 -0
- ksadk/server/api_models.py +73 -0
- ksadk/server/app.py +3789 -0
- ksadk/server/static/assets/ArtifactsPanel-C0meuOdi.js +1 -0
- ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +9 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +8 -0
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
- ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
- ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +1 -0
- ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
- ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
- ksadk/server/static/assets/arc-bj2rZnP5.js +1 -0
- ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +1 -0
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-2u1ltDIj.js +36 -0
- ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
- ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
- ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-D6fvdK20.js +132 -0
- ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-BK82L5n5.js +10 -0
- ksadk/server/static/assets/channel-BSSOwFIb.js +1 -0
- ksadk/server/static/assets/chunk-2J33WTMH-DLVdkeyQ.js +1 -0
- ksadk/server/static/assets/chunk-4BX2VUAB-BbwsYcbW.js +1 -0
- ksadk/server/static/assets/chunk-55IACEB6-DOairxzw.js +1 -0
- ksadk/server/static/assets/chunk-727SXJPM-hCO487gs.js +206 -0
- ksadk/server/static/assets/chunk-AQP2D5EJ-XU8vDOuG.js +231 -0
- ksadk/server/static/assets/chunk-FMBD7UC4-PrapyfMu.js +15 -0
- ksadk/server/static/assets/chunk-ND2GUHAM-CboKhTZ3.js +1 -0
- ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
- ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
- ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
- ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
- ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
- ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
- ksadk/server/static/assets/cose-bilkent-S5V4N54A-_N8bJ-EU.js +1 -0
- ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
- ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
- ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
- ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
- ksadk/server/static/assets/dagre-BM42HDAG-FoDlo5J2.js +4 -0
- ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
- ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
- ksadk/server/static/assets/diagram-2AECGRRQ-BBp6ebBw.js +43 -0
- ksadk/server/static/assets/diagram-5GNKFQAL-CqOvG1PR.js +10 -0
- ksadk/server/static/assets/diagram-KO2AKTUF-O9T3t6ba.js +3 -0
- ksadk/server/static/assets/diagram-LMA3HP47-CGG8ekBO.js +24 -0
- ksadk/server/static/assets/diagram-OG6HWLK6-4BmH1EEg.js +24 -0
- ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
- ksadk/server/static/assets/dist-6kSZvCZh.js +1 -0
- ksadk/server/static/assets/dist-B67uF2uK.js +1 -0
- ksadk/server/static/assets/dist-BMKM66B4.js +1 -0
- ksadk/server/static/assets/dist-BVzcWa6D.js +1 -0
- ksadk/server/static/assets/dist-Bk1l05Ni.js +1 -0
- ksadk/server/static/assets/dist-BkJjNih3.js +1 -0
- ksadk/server/static/assets/dist-BmuTWcm7.js +9 -0
- ksadk/server/static/assets/dist-C2DKRFVK.js +1 -0
- ksadk/server/static/assets/dist-CWiTDN_V.js +6 -0
- ksadk/server/static/assets/dist-CZ6C3x8B.js +23 -0
- ksadk/server/static/assets/dist-CiZHB6ZW.js +1 -0
- ksadk/server/static/assets/dist-Cp1_jKwf.js +1 -0
- ksadk/server/static/assets/dist-Cwhk4lwI.js +2 -0
- ksadk/server/static/assets/dist-D5JGcxBx.js +11 -0
- ksadk/server/static/assets/dist-D99wf6_X.js +1 -0
- ksadk/server/static/assets/dist-DCpZrjaK.js +1 -0
- ksadk/server/static/assets/dist-DI-oVAXw.js +1 -0
- ksadk/server/static/assets/dist-DLMjL01k.js +1 -0
- ksadk/server/static/assets/dist-DLeM1OCK.js +1 -0
- ksadk/server/static/assets/dist-DM0rEQPk.js +1 -0
- ksadk/server/static/assets/dist-DbaH3p5h.js +1 -0
- ksadk/server/static/assets/dist-S4klkK5W.js +1 -0
- ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
- ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
- ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
- ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
- ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
- ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
- ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
- ksadk/server/static/assets/erDiagram-TEJ5UH35-oJhaci7S.js +85 -0
- ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
- ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +1 -0
- ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
- ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DtTmUan-.js +162 -0
- ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
- ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BSsb_eij.js +292 -0
- ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
- ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-BR5s6Pws.js +106 -0
- ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
- ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
- ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
- ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
- ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
- ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
- ksadk/server/static/assets/index-BH7-pC0B.js +165 -0
- ksadk/server/static/assets/index-DAURbCsP.css +1 -0
- ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +1 -0
- ksadk/server/static/assets/infoDiagram-5YYISTIA-DYPc5cvh.js +2 -0
- ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
- ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-MoBdALDg.js +70 -0
- ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
- ksadk/server/static/assets/journeyDiagram-JHISSGLW-DgLiQT8l.js +139 -0
- ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
- ksadk/server/static/assets/kanban-definition-UN3LZRKU-CsFx112F.js +89 -0
- ksadk/server/static/assets/katex-DRsiwpM2.js +265 -0
- ksadk/server/static/assets/linear-TNRQ5Orv.js +1 -0
- ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
- ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
- ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
- ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
- ksadk/server/static/assets/mermaid-parser.core-D2eMVOgo.js +161 -0
- ksadk/server/static/assets/mindmap-definition-RKZ34NQL-BtByYFhL.js +96 -0
- ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
- ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
- ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
- ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
- ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
- ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
- ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
- ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
- ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
- ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
- ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
- ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +1 -0
- ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
- ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +1 -0
- ksadk/server/static/assets/pieDiagram-4H26LBE5-DPnuCB8c.js +30 -0
- ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
- ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
- ksadk/server/static/assets/properties-C357ku5U.js +1 -0
- ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
- ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
- ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
- ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
- ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
- ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-miFpCPv4.js +7 -0
- ksadk/server/static/assets/r-DADKenSm.js +1 -0
- ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +1 -0
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-mjB_yYkW.js +84 -0
- ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
- ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
- ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-D7hSlZZZ.js +40 -0
- ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
- ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
- ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-D9Cx6hC3.js +162 -0
- ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
- ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
- ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
- ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
- ksadk/server/static/assets/solr-BBopId9w.js +1 -0
- ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
- ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
- ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
- ksadk/server/static/assets/stateDiagram-AJRCARHV-D_zrg47o.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +1 -0
- ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
- ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
- ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
- ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
- ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
- ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
- ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
- ksadk/server/static/assets/timeline-definition-PNZ67QCA-CwSec0Wa.js +120 -0
- ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
- ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +1 -0
- ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
- ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
- ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
- ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
- ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
- ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
- ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-agCVobiF.js +34 -0
- ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
- ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
- ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-TmrlhWNt.js +78 -0
- ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
- ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
- ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-DV71V-ah.js +7 -0
- ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
- ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
- ksadk/server/static/favicon.svg +1 -0
- ksadk/server/static/icons.svg +24 -0
- ksadk/server/static/index.html +14 -0
- ksadk/server/terminal_sessions.py +551 -0
- ksadk/sessions/__init__.py +283 -0
- ksadk/sessions/base.py +354 -0
- ksadk/sessions/continuity.py +313 -0
- ksadk/sessions/errors.py +7 -0
- ksadk/sessions/in_memory.py +273 -0
- ksadk/sessions/local_service.py +949 -0
- ksadk/sessions/postgres_service.py +838 -0
- ksadk/sessions/sqlite_service.py +13 -0
- ksadk/skills/__init__.py +9 -0
- ksadk/skills/loader.py +46 -0
- ksadk/skills/models.py +120 -0
- ksadk/skills/package_store.py +104 -0
- ksadk/skills/runtime/__init__.py +17 -0
- ksadk/skills/runtime/agent.py +183 -0
- ksadk/skills/runtime/artifacts.py +39 -0
- ksadk/skills/runtime/backends/__init__.py +1 -0
- ksadk/skills/runtime/backends/disabled.py +8 -0
- ksadk/skills/runtime/backends/e2b.py +168 -0
- ksadk/skills/runtime/backends/local.py +95 -0
- ksadk/skills/runtime/base.py +103 -0
- ksadk/skills/runtime/executor.py +219 -0
- ksadk/skills/runtime/factory.py +37 -0
- ksadk/skills/runtime/loader.py +131 -0
- ksadk/skills/runtime/registry.py +150 -0
- ksadk/skills/runtime/request.py +67 -0
- ksadk/skills/service_client.py +239 -0
- ksadk/skills/service_env.py +58 -0
- ksadk/skills/tool_defs.py +221 -0
- ksadk/terminal_client.py +69 -0
- ksadk/terminal_exec_policy.py +229 -0
- ksadk/tools/__init__.py +17 -0
- ksadk/tools/gateway.py +230 -0
- ksadk/tools/result_budget.py +154 -0
- ksadk/toolsets/__init__.py +852 -0
- ksadk/toolsets/_langchain.py +11 -0
- ksadk/toolsets/platform.py +93 -0
- ksadk/toolsets/sandbox.py +310 -0
- ksadk/toolsets/skills.py +217 -0
- ksadk/toolsets/web.py +266 -0
- ksadk/toolsets/workspace.py +878 -0
- ksadk/toolsets/workspace_state.py +44 -0
- ksadk/tracing/__init__.py +37 -0
- ksadk/tracing/exporters/__init__.py +1 -0
- ksadk/tracing/exporters/inmemory_exporter.py +116 -0
- ksadk/tracing/exporters/langfuse_exporter.py +445 -0
- ksadk/tracing/setup.py +829 -0
- ksadk/tracing/span_utils.py +114 -0
- ksadk/tui/__init__.py +12 -0
- ksadk/tui/app.py +400 -0
- ksadk/tui/clipboard.py +100 -0
- ksadk/tui/widgets/__init__.py +22 -0
- ksadk/tui/widgets/assistant.py +89 -0
- ksadk/tui/widgets/base.py +54 -0
- ksadk/tui/widgets/chat_input.py +246 -0
- ksadk/tui/widgets/history.py +156 -0
- ksadk/tui/widgets/system.py +87 -0
- ksadk/tui/widgets/thinking.py +110 -0
- ksadk/tui/widgets/tool_call.py +161 -0
- ksadk/tui/widgets/user.py +37 -0
- ksadk/ui_config.py +168 -0
- ksadk/version.py +4 -0
- ksadk_runtime_common/__init__.py +20 -0
- ksadk_runtime_common/memory_backend/__init__.py +29 -0
- ksadk_runtime_common/memory_backend/manifest.py +79 -0
- ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
- ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
- ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
- ksadk_runtime_common/memory_backend/registry.py +56 -0
- ksadk_runtime_common/memory_backend/render.py +71 -0
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
- ksadk_runtime_common/workspace_files/__init__.py +29 -0
- ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
- ksadk_runtime_common/workspace_files/constants.py +9 -0
- ksadk_runtime_common/workspace_files/path_utils.py +71 -0
- ksadk_runtime_common/workspace_files/preview.py +96 -0
- ksadk_runtime_common/workspace_files/router.py +254 -0
- agentengine_sdk_python-0.6.2.dist-info/METADATA +0 -46
- agentengine_sdk_python-0.6.2.dist-info/RECORD +0 -4
- agentengine_sdk_python-0.6.2.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,706 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AgentEngine 统一配置管理
|
|
3
|
+
|
|
4
|
+
从环境变量加载配置。
|
|
5
|
+
优先使用开源/业界标准变量名,同时兼容 Serverless 平台定制变量。
|
|
6
|
+
|
|
7
|
+
使用方式:
|
|
8
|
+
from ksadk.configs import settings
|
|
9
|
+
|
|
10
|
+
# 访问模型配置
|
|
11
|
+
print(settings.model.api_key)
|
|
12
|
+
print(settings.model.api_base)
|
|
13
|
+
|
|
14
|
+
# 访问 Langfuse 配置
|
|
15
|
+
print(settings.langfuse.public_key)
|
|
16
|
+
|
|
17
|
+
# 访问 Agent 运行时信息
|
|
18
|
+
print(settings.agent.agent_id)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import json
|
|
23
|
+
import logging
|
|
24
|
+
import time
|
|
25
|
+
from typing import Optional, List, Dict, Any
|
|
26
|
+
from dataclasses import dataclass, field
|
|
27
|
+
from urllib.parse import urlsplit, urlunsplit
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _get_env(*keys: str, default: str = None) -> Optional[str]:
|
|
33
|
+
"""从多个环境变量 key 中获取第一个存在的值
|
|
34
|
+
|
|
35
|
+
按优先级顺序匹配,支持别名兼容。
|
|
36
|
+
"""
|
|
37
|
+
for key in keys:
|
|
38
|
+
value = os.getenv(key)
|
|
39
|
+
if value:
|
|
40
|
+
return value
|
|
41
|
+
return default
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# =============================================================================
|
|
45
|
+
# 网络检测工具 (通用)
|
|
46
|
+
# =============================================================================
|
|
47
|
+
|
|
48
|
+
# 缓存检测结果 {host: is_reachable}
|
|
49
|
+
_endpoint_cache: Dict[str, bool] = {}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _is_internal_runtime_env() -> bool:
|
|
53
|
+
return any(
|
|
54
|
+
os.getenv(key)
|
|
55
|
+
for key in (
|
|
56
|
+
"AGENT_RUNTIME_ID",
|
|
57
|
+
"K_SERVICE",
|
|
58
|
+
"KUBERNETES_SERVICE_HOST",
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _is_public_kspmas_url(url: Optional[str]) -> bool:
|
|
64
|
+
value = (url or "").strip().rstrip("/")
|
|
65
|
+
if not value:
|
|
66
|
+
return False
|
|
67
|
+
return "kspmas.ksyun.com/v1" in value
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def check_endpoint_reachable(host: str, port: int = 80, timeout: float = 1.0) -> bool:
|
|
71
|
+
"""检测指定端点是否可达
|
|
72
|
+
|
|
73
|
+
通用函数,可用于检测任意服务的内网地址是否可达。
|
|
74
|
+
结果会被缓存,相同 host 只检测一次。
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
host: 主机名或 IP 地址
|
|
78
|
+
port: 端口号 (默认 80)
|
|
79
|
+
timeout: 超时时间 (默认 1.0 秒)
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
True 如果可达, False 否则
|
|
83
|
+
|
|
84
|
+
Usage:
|
|
85
|
+
# KSPMAS 内网检测
|
|
86
|
+
if check_endpoint_reachable("kspmas-internal.sdns.ksyun.com"):
|
|
87
|
+
api_base = "http://kspmas-internal.sdns.ksyun.com/v1"
|
|
88
|
+
|
|
89
|
+
# KS3 内网检测
|
|
90
|
+
if check_endpoint_reachable("ks3-cn-beijing-internal.ksyuncs.com"):
|
|
91
|
+
ks3_endpoint = "http://ks3-cn-beijing-internal.ksyuncs.com"
|
|
92
|
+
"""
|
|
93
|
+
if host in _endpoint_cache:
|
|
94
|
+
return _endpoint_cache[host]
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
import socket
|
|
98
|
+
# 尝试建立 TCP 连接 (比 ping 更可靠,且不依赖 ICMP)
|
|
99
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
100
|
+
s.settimeout(timeout)
|
|
101
|
+
s.connect((host, port))
|
|
102
|
+
s.close()
|
|
103
|
+
|
|
104
|
+
_endpoint_cache[host] = True
|
|
105
|
+
logger.debug(f"Endpoint reachable: {host}:{port}")
|
|
106
|
+
except (socket.timeout, socket.error, OSError):
|
|
107
|
+
_endpoint_cache[host] = False
|
|
108
|
+
logger.debug(f"Endpoint not reachable: {host}:{port}")
|
|
109
|
+
|
|
110
|
+
return _endpoint_cache[host]
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# =============================================================================
|
|
114
|
+
# 金山云模型服务 (KSPMAS)
|
|
115
|
+
# =============================================================================
|
|
116
|
+
|
|
117
|
+
# 服务地址
|
|
118
|
+
KSPMAS_INTERNAL_HOST = "kspmas-internal.sdns.ksyun.com"
|
|
119
|
+
KSPMAS_INTERNAL_URL = f"http://{KSPMAS_INTERNAL_HOST}/v1"
|
|
120
|
+
KSPMAS_PUBLIC_URL = "https://kspmas.ksyun.com/v1"
|
|
121
|
+
|
|
122
|
+
# 默认模型
|
|
123
|
+
DEFAULT_MODEL_NAME = "glm-5.2"
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def optimize_kspmas_url(url: str) -> str:
|
|
127
|
+
"""优化 KSPMAS URL
|
|
128
|
+
|
|
129
|
+
如果是 KSPMAS 的公网地址,且检测到内网可达(或在 Serverless 环境),
|
|
130
|
+
将其替换为内网地址以提高速度和稳定性。
|
|
131
|
+
"""
|
|
132
|
+
if not url:
|
|
133
|
+
return url
|
|
134
|
+
|
|
135
|
+
parsed = urlsplit(url)
|
|
136
|
+
if parsed.hostname != "kspmas.ksyun.com":
|
|
137
|
+
return url
|
|
138
|
+
|
|
139
|
+
use_internal = False
|
|
140
|
+
if _is_internal_runtime_env():
|
|
141
|
+
use_internal = True
|
|
142
|
+
elif check_endpoint_reachable(KSPMAS_INTERNAL_HOST):
|
|
143
|
+
use_internal = True
|
|
144
|
+
|
|
145
|
+
if use_internal:
|
|
146
|
+
netloc = KSPMAS_INTERNAL_HOST
|
|
147
|
+
if parsed.port:
|
|
148
|
+
netloc = f"{netloc}:{parsed.port}"
|
|
149
|
+
return urlunsplit(("http", netloc, parsed.path, parsed.query, parsed.fragment))
|
|
150
|
+
|
|
151
|
+
return url
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def get_kspmas_api_base() -> str:
|
|
155
|
+
"""获取 KSPMAS 模型服务的 API Base URL
|
|
156
|
+
|
|
157
|
+
自动检测内网可达性,优先使用内网地址。
|
|
158
|
+
**特殊逻辑**: 如果在 Serverless 托管环境 (AGENT_RUNTIME_ID 存在),强制使用内网地址。
|
|
159
|
+
"""
|
|
160
|
+
# 1. 托管 / 集群环境强制使用内网
|
|
161
|
+
if _is_internal_runtime_env():
|
|
162
|
+
return KSPMAS_INTERNAL_URL
|
|
163
|
+
|
|
164
|
+
# 2. 自动检测内网可达性
|
|
165
|
+
if check_endpoint_reachable(KSPMAS_INTERNAL_HOST):
|
|
166
|
+
return KSPMAS_INTERNAL_URL
|
|
167
|
+
|
|
168
|
+
# 3. 默认使用公网
|
|
169
|
+
return KSPMAS_PUBLIC_URL
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# =============================================================================
|
|
173
|
+
# 模型配置 (LLM)
|
|
174
|
+
# =============================================================================
|
|
175
|
+
|
|
176
|
+
@dataclass
|
|
177
|
+
class ModelConfig:
|
|
178
|
+
"""模型配置
|
|
179
|
+
|
|
180
|
+
标准环境变量 (优先):
|
|
181
|
+
OPENAI_API_KEY - API Key (OpenAI 标准)
|
|
182
|
+
OPENAI_BASE_URL - API Base URL (OpenAI 标准)
|
|
183
|
+
OPENAI_MODEL_NAME - 模型名称
|
|
184
|
+
|
|
185
|
+
通用格式:
|
|
186
|
+
MODEL_NAME - 模型名称
|
|
187
|
+
|
|
188
|
+
Serverless 平台兼容:
|
|
189
|
+
LLM_API_KEY - 模型 API Key
|
|
190
|
+
LLM_API_BASE - 模型 API 地址
|
|
191
|
+
LLM_MODEL - 模型名称
|
|
192
|
+
|
|
193
|
+
别名 (兼容):
|
|
194
|
+
OPENAI_API_BASE - API Base URL 别名
|
|
195
|
+
|
|
196
|
+
默认值:
|
|
197
|
+
OPENAI_BASE_URL: 自动检测内网/外网,使用金山云模型服务
|
|
198
|
+
MODEL_NAME: glm-5.2
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def api_key(self) -> Optional[str]:
|
|
203
|
+
"""获取模型 API Key"""
|
|
204
|
+
return _get_env(
|
|
205
|
+
"OPENAI_API_KEY", # OpenAI 标准 (优先)
|
|
206
|
+
"LLM_API_KEY", # Serverless 平台兼容
|
|
207
|
+
"MODEL_API_KEY", # 通用
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def api_base(self) -> str:
|
|
212
|
+
"""获取模型 API Base URL
|
|
213
|
+
|
|
214
|
+
如果未配置,默认使用金山云模型服务地址(自动检测内网)。
|
|
215
|
+
如果已配置且为 KSPMAS 公网地址,也会尝试优化为内网地址。
|
|
216
|
+
"""
|
|
217
|
+
configured = _get_env(
|
|
218
|
+
"OPENAI_BASE_URL", # OpenAI 标准 (优先)
|
|
219
|
+
"OPENAI_API_BASE", # OpenAI 别名 (兼容)
|
|
220
|
+
"LLM_API_BASE", # Serverless 平台兼容
|
|
221
|
+
"MODEL_API_BASE", # 通用
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
if configured:
|
|
225
|
+
return optimize_kspmas_url(configured)
|
|
226
|
+
|
|
227
|
+
return get_kspmas_api_base()
|
|
228
|
+
|
|
229
|
+
@property
|
|
230
|
+
def model_name(self) -> str:
|
|
231
|
+
"""获取模型名称
|
|
232
|
+
|
|
233
|
+
如果未配置,默认使用 glm-5.2。
|
|
234
|
+
"""
|
|
235
|
+
configured = _get_env(
|
|
236
|
+
"OPENAI_MODEL_NAME", # OpenAI 格式 (优先)
|
|
237
|
+
"MODEL_NAME", # 通用
|
|
238
|
+
"LLM_MODEL", # Serverless 平台兼容
|
|
239
|
+
)
|
|
240
|
+
return configured or DEFAULT_MODEL_NAME
|
|
241
|
+
|
|
242
|
+
@property
|
|
243
|
+
def is_configured(self) -> bool:
|
|
244
|
+
"""是否已配置 API Key"""
|
|
245
|
+
return bool(self.api_key)
|
|
246
|
+
|
|
247
|
+
@property
|
|
248
|
+
def is_using_internal_network(self) -> bool:
|
|
249
|
+
"""是否使用内网地址"""
|
|
250
|
+
return KSPMAS_INTERNAL_URL in self.api_base
|
|
251
|
+
|
|
252
|
+
def to_dict(self) -> dict:
|
|
253
|
+
"""转换为字典 (用于 LiteLLM 等)"""
|
|
254
|
+
result = {}
|
|
255
|
+
if self.api_key:
|
|
256
|
+
result["api_key"] = self.api_key
|
|
257
|
+
result["api_base"] = self.api_base
|
|
258
|
+
result["model"] = self.model_name
|
|
259
|
+
return result
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
# =============================================================================
|
|
263
|
+
# Langfuse 配置
|
|
264
|
+
# =============================================================================
|
|
265
|
+
|
|
266
|
+
@dataclass
|
|
267
|
+
class LangfuseConfig:
|
|
268
|
+
"""Langfuse 可观测性配置
|
|
269
|
+
|
|
270
|
+
标准环境变量 (Langfuse 官方):
|
|
271
|
+
LANGFUSE_PUBLIC_KEY - API Public Key
|
|
272
|
+
LANGFUSE_SECRET_KEY - API Secret Key
|
|
273
|
+
LANGFUSE_HOST - Langfuse 服务地址
|
|
274
|
+
|
|
275
|
+
Serverless 平台扩展:
|
|
276
|
+
LANGFUSE_PROJECT_ID - 项目 ID (区分用户)
|
|
277
|
+
LANGCHAIN_TRACING_V2 - 启用 LangChain 追踪
|
|
278
|
+
"""
|
|
279
|
+
|
|
280
|
+
@property
|
|
281
|
+
def public_key(self) -> Optional[str]:
|
|
282
|
+
return os.getenv("LANGFUSE_PUBLIC_KEY")
|
|
283
|
+
|
|
284
|
+
@property
|
|
285
|
+
def secret_key(self) -> Optional[str]:
|
|
286
|
+
return os.getenv("LANGFUSE_SECRET_KEY")
|
|
287
|
+
|
|
288
|
+
@property
|
|
289
|
+
def host(self) -> str:
|
|
290
|
+
return _get_env(
|
|
291
|
+
"LANGFUSE_HOST",
|
|
292
|
+
"LANGFUSE_BASE_URL",
|
|
293
|
+
default="http://localhost:3000"
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
@property
|
|
297
|
+
def project_id(self) -> Optional[str]:
|
|
298
|
+
"""Langfuse 项目 ID (Serverless 平台扩展)"""
|
|
299
|
+
return os.getenv("LANGFUSE_PROJECT_ID")
|
|
300
|
+
|
|
301
|
+
@property
|
|
302
|
+
def tracing_enabled(self) -> bool:
|
|
303
|
+
"""是否启用 LangChain tracing"""
|
|
304
|
+
return os.getenv("LANGCHAIN_TRACING_V2", "").lower() == "true"
|
|
305
|
+
|
|
306
|
+
@property
|
|
307
|
+
def is_enabled(self) -> bool:
|
|
308
|
+
"""是否启用 Langfuse (有 public_key 就启用)"""
|
|
309
|
+
return bool(self.public_key)
|
|
310
|
+
|
|
311
|
+
@property
|
|
312
|
+
def is_configured(self) -> bool:
|
|
313
|
+
"""是否完整配置"""
|
|
314
|
+
return bool(self.public_key and self.secret_key)
|
|
315
|
+
|
|
316
|
+
def to_dict(self) -> dict:
|
|
317
|
+
"""转换为字典"""
|
|
318
|
+
return {
|
|
319
|
+
"public_key": self.public_key,
|
|
320
|
+
"secret_key": self.secret_key,
|
|
321
|
+
"host": self.host,
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
# =============================================================================
|
|
326
|
+
# Agent 配置
|
|
327
|
+
# =============================================================================
|
|
328
|
+
|
|
329
|
+
@dataclass
|
|
330
|
+
class AgentConfig:
|
|
331
|
+
"""Agent 配置
|
|
332
|
+
|
|
333
|
+
标准环境变量 (OpenTelemetry 兼容):
|
|
334
|
+
OTEL_SERVICE_NAME - 服务名称 (映射到 agent_name)
|
|
335
|
+
OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value 格式)
|
|
336
|
+
|
|
337
|
+
通用环境变量:
|
|
338
|
+
AGENT_ID - Agent 唯一 ID
|
|
339
|
+
AGENT_NAME - Agent 名称
|
|
340
|
+
TENANT_ID - 租户 ID
|
|
341
|
+
USER_ID - 用户 ID
|
|
342
|
+
ENVIRONMENT - 运行环境 (dev/staging/prod)
|
|
343
|
+
VERSION - 版本号
|
|
344
|
+
|
|
345
|
+
Serverless 平台兼容:
|
|
346
|
+
AGENT_RUNTIME_ID - Agent 唯一 ID
|
|
347
|
+
AGENT_RUNTIME_NAME - Agent 名称
|
|
348
|
+
ACCOUNT_ID - 账户 ID (租户)
|
|
349
|
+
"""
|
|
350
|
+
|
|
351
|
+
@property
|
|
352
|
+
def agent_id(self) -> Optional[str]:
|
|
353
|
+
"""Agent 唯一 ID"""
|
|
354
|
+
return _get_env(
|
|
355
|
+
"AGENT_ID", # 通用 (优先)
|
|
356
|
+
"AGENT_RUNTIME_ID", # Serverless 平台兼容
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
@property
|
|
360
|
+
def agent_name(self) -> Optional[str]:
|
|
361
|
+
"""Agent 名称"""
|
|
362
|
+
return _get_env(
|
|
363
|
+
"AGENT_NAME", # 通用 (优先)
|
|
364
|
+
"AGENT_RUNTIME_NAME", # Serverless 平台兼容
|
|
365
|
+
"OTEL_SERVICE_NAME", # OpenTelemetry 标准
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
@property
|
|
369
|
+
def tenant_id(self) -> Optional[str]:
|
|
370
|
+
"""租户 ID"""
|
|
371
|
+
return _get_env(
|
|
372
|
+
"TENANT_ID", # 通用 (优先)
|
|
373
|
+
"ACCOUNT_ID", # Serverless 平台兼容
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
@property
|
|
377
|
+
def user_id(self) -> Optional[str]:
|
|
378
|
+
"""用户 ID"""
|
|
379
|
+
return os.getenv("USER_ID")
|
|
380
|
+
|
|
381
|
+
@property
|
|
382
|
+
def session_id(self) -> Optional[str]:
|
|
383
|
+
"""会话 ID (用于 Langfuse Sessions 功能)"""
|
|
384
|
+
return os.getenv("SESSION_ID")
|
|
385
|
+
|
|
386
|
+
@property
|
|
387
|
+
def environment(self) -> Optional[str]:
|
|
388
|
+
"""运行环境 (dev/staging/prod)"""
|
|
389
|
+
return os.getenv("ENVIRONMENT")
|
|
390
|
+
|
|
391
|
+
@property
|
|
392
|
+
def version(self) -> Optional[str]:
|
|
393
|
+
"""Agent 版本"""
|
|
394
|
+
return os.getenv("VERSION")
|
|
395
|
+
|
|
396
|
+
@property
|
|
397
|
+
def tags(self) -> Optional[List[str]]:
|
|
398
|
+
"""标签列表 (逗号分隔)"""
|
|
399
|
+
tags_str = os.getenv("TAGS", "")
|
|
400
|
+
tags = [t.strip() for t in tags_str.split(",") if t.strip()]
|
|
401
|
+
return tags if tags else None
|
|
402
|
+
|
|
403
|
+
@property
|
|
404
|
+
def extra_metadata(self) -> Optional[Dict[str, Any]]:
|
|
405
|
+
"""额外的元数据"""
|
|
406
|
+
extra = {}
|
|
407
|
+
|
|
408
|
+
# 1. 解析 JSON 格式的 metadata
|
|
409
|
+
extra_json = os.getenv("METADATA")
|
|
410
|
+
if extra_json:
|
|
411
|
+
try:
|
|
412
|
+
extra.update(json.loads(extra_json))
|
|
413
|
+
except json.JSONDecodeError:
|
|
414
|
+
logger.warning(f"Invalid METADATA JSON: {extra_json}")
|
|
415
|
+
|
|
416
|
+
# 2. 解析 OTEL_RESOURCE_ATTRIBUTES
|
|
417
|
+
otel_attrs = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
|
|
418
|
+
if otel_attrs:
|
|
419
|
+
for pair in otel_attrs.split(","):
|
|
420
|
+
if "=" in pair:
|
|
421
|
+
key, value = pair.split("=", 1)
|
|
422
|
+
if key not in ("service.name", "service.version"):
|
|
423
|
+
extra[key] = value
|
|
424
|
+
|
|
425
|
+
return extra if extra else None
|
|
426
|
+
|
|
427
|
+
@property
|
|
428
|
+
def is_configured(self) -> bool:
|
|
429
|
+
"""是否有 Agent 信息"""
|
|
430
|
+
return bool(self.agent_id or self.agent_name)
|
|
431
|
+
|
|
432
|
+
# ------------------
|
|
433
|
+
# Langfuse 集成方法
|
|
434
|
+
# ------------------
|
|
435
|
+
|
|
436
|
+
def to_langfuse_params(self) -> dict:
|
|
437
|
+
"""转换为 Langfuse trace() 方法的原生参数"""
|
|
438
|
+
params = {}
|
|
439
|
+
if self.session_id:
|
|
440
|
+
params["session_id"] = self.session_id
|
|
441
|
+
if self.user_id:
|
|
442
|
+
params["user_id"] = self.user_id
|
|
443
|
+
if self.tags:
|
|
444
|
+
params["tags"] = self.tags
|
|
445
|
+
if self.version:
|
|
446
|
+
params["version"] = self.version
|
|
447
|
+
return params
|
|
448
|
+
|
|
449
|
+
def to_langfuse_metadata(self) -> dict:
|
|
450
|
+
"""转换为 Langfuse metadata 字段"""
|
|
451
|
+
metadata = {}
|
|
452
|
+
if self.agent_id:
|
|
453
|
+
metadata["agent_id"] = self.agent_id
|
|
454
|
+
if self.agent_name:
|
|
455
|
+
metadata["agent_name"] = self.agent_name
|
|
456
|
+
if self.tenant_id:
|
|
457
|
+
metadata["tenant_id"] = self.tenant_id
|
|
458
|
+
if self.environment:
|
|
459
|
+
metadata["environment"] = self.environment
|
|
460
|
+
if self.extra_metadata:
|
|
461
|
+
metadata.update(self.extra_metadata)
|
|
462
|
+
return metadata
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
# =============================================================================
|
|
466
|
+
# 金山云配置
|
|
467
|
+
# =============================================================================
|
|
468
|
+
|
|
469
|
+
@dataclass
|
|
470
|
+
class KingsoftCloudConfig:
|
|
471
|
+
"""金山云 SDK 配置
|
|
472
|
+
|
|
473
|
+
环境变量:
|
|
474
|
+
KS_ACCESS_KEY_ID - Access Key ID
|
|
475
|
+
KS_SECRET_ACCESS_KEY - Secret Access Key
|
|
476
|
+
KS_REGION - 区域 (默认 cn-beijing-6)
|
|
477
|
+
"""
|
|
478
|
+
|
|
479
|
+
@property
|
|
480
|
+
def access_key_id(self) -> Optional[str]:
|
|
481
|
+
return os.getenv("KS_ACCESS_KEY_ID")
|
|
482
|
+
|
|
483
|
+
@property
|
|
484
|
+
def secret_access_key(self) -> Optional[str]:
|
|
485
|
+
return os.getenv("KS_SECRET_ACCESS_KEY")
|
|
486
|
+
|
|
487
|
+
@property
|
|
488
|
+
def region(self) -> str:
|
|
489
|
+
return os.getenv("KS_REGION", "cn-beijing-6")
|
|
490
|
+
|
|
491
|
+
@property
|
|
492
|
+
def is_configured(self) -> bool:
|
|
493
|
+
"""是否已配置"""
|
|
494
|
+
return bool(self.access_key_id and self.secret_access_key)
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
# =============================================================================
|
|
498
|
+
# Code 模式配置
|
|
499
|
+
# =============================================================================
|
|
500
|
+
|
|
501
|
+
@dataclass
|
|
502
|
+
class CodeModeConfig:
|
|
503
|
+
"""Code 模式配置 (Serverless 平台)
|
|
504
|
+
|
|
505
|
+
环境变量:
|
|
506
|
+
PYTHONPATH - Python 模块路径
|
|
507
|
+
CODE_PATH - 代码目录
|
|
508
|
+
"""
|
|
509
|
+
|
|
510
|
+
@property
|
|
511
|
+
def python_path(self) -> Optional[str]:
|
|
512
|
+
return os.getenv("PYTHONPATH")
|
|
513
|
+
|
|
514
|
+
@property
|
|
515
|
+
def code_path(self) -> Optional[str]:
|
|
516
|
+
return os.getenv("CODE_PATH")
|
|
517
|
+
|
|
518
|
+
@property
|
|
519
|
+
def is_code_mode(self) -> bool:
|
|
520
|
+
"""是否为 Code 模式"""
|
|
521
|
+
return bool(self.code_path)
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
# =============================================================================
|
|
525
|
+
# OpenTelemetry 配置
|
|
526
|
+
# =============================================================================
|
|
527
|
+
|
|
528
|
+
@dataclass
|
|
529
|
+
class OTelConfig:
|
|
530
|
+
"""OpenTelemetry 配置 (标准环境变量)
|
|
531
|
+
|
|
532
|
+
环境变量:
|
|
533
|
+
OTEL_SERVICE_NAME - 服务名称
|
|
534
|
+
OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value,key2=value2)
|
|
535
|
+
OTEL_EXPORTER_OTLP_ENDPOINT - OTLP 导出端点
|
|
536
|
+
"""
|
|
537
|
+
|
|
538
|
+
@property
|
|
539
|
+
def service_name(self) -> Optional[str]:
|
|
540
|
+
return os.getenv("OTEL_SERVICE_NAME")
|
|
541
|
+
|
|
542
|
+
@property
|
|
543
|
+
def resource_attributes(self) -> Optional[Dict[str, str]]:
|
|
544
|
+
"""解析 OTEL_RESOURCE_ATTRIBUTES"""
|
|
545
|
+
attrs_str = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
|
|
546
|
+
if not attrs_str:
|
|
547
|
+
return None
|
|
548
|
+
|
|
549
|
+
attrs = {}
|
|
550
|
+
for pair in attrs_str.split(","):
|
|
551
|
+
if "=" in pair:
|
|
552
|
+
key, value = pair.split("=", 1)
|
|
553
|
+
attrs[key] = value
|
|
554
|
+
return attrs if attrs else None
|
|
555
|
+
|
|
556
|
+
@property
|
|
557
|
+
def otlp_endpoint(self) -> Optional[str]:
|
|
558
|
+
return _get_env(
|
|
559
|
+
"OTEL_EXPORTER_OTLP_ENDPOINT",
|
|
560
|
+
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
@property
|
|
564
|
+
def is_enabled(self) -> bool:
|
|
565
|
+
"""是否启用 OTLP 导出"""
|
|
566
|
+
return bool(self.otlp_endpoint)
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
# =============================================================================
|
|
570
|
+
# 统一配置入口
|
|
571
|
+
# =============================================================================
|
|
572
|
+
|
|
573
|
+
@dataclass
|
|
574
|
+
class Settings:
|
|
575
|
+
"""统一配置入口
|
|
576
|
+
|
|
577
|
+
使用方式:
|
|
578
|
+
from ksadk.configs import settings
|
|
579
|
+
|
|
580
|
+
# 模型配置
|
|
581
|
+
if settings.model.is_configured:
|
|
582
|
+
llm = LiteLLM(api_key=settings.model.api_key)
|
|
583
|
+
|
|
584
|
+
# Langfuse 配置
|
|
585
|
+
if settings.langfuse.is_enabled:
|
|
586
|
+
setup_tracing(langfuse_config=settings.langfuse.to_dict())
|
|
587
|
+
|
|
588
|
+
# Agent 信息
|
|
589
|
+
print(settings.agent.agent_id)
|
|
590
|
+
"""
|
|
591
|
+
model: ModelConfig = field(default_factory=ModelConfig)
|
|
592
|
+
langfuse: LangfuseConfig = field(default_factory=LangfuseConfig)
|
|
593
|
+
agent: AgentConfig = field(default_factory=AgentConfig)
|
|
594
|
+
cloud: KingsoftCloudConfig = field(default_factory=KingsoftCloudConfig)
|
|
595
|
+
code: CodeModeConfig = field(default_factory=CodeModeConfig)
|
|
596
|
+
otel: OTelConfig = field(default_factory=OTelConfig)
|
|
597
|
+
|
|
598
|
+
def summary(self) -> str:
|
|
599
|
+
"""输出配置摘要"""
|
|
600
|
+
lines = ["AgentEngine Configuration:"]
|
|
601
|
+
lines.append(f" Model: {'✅ Configured' if self.model.is_configured else '❌ Not configured'}")
|
|
602
|
+
lines.append(f" Langfuse: {'✅ Enabled' if self.langfuse.is_enabled else '⚪ Disabled'}")
|
|
603
|
+
|
|
604
|
+
agent_info = self.agent.agent_id or self.agent.agent_name
|
|
605
|
+
lines.append(f" Agent: {'✅ ' + agent_info if agent_info else '⚪ No info'}")
|
|
606
|
+
|
|
607
|
+
lines.append(f" Cloud: {'✅ Configured' if self.cloud.is_configured else '⚪ Not configured'}")
|
|
608
|
+
lines.append(f" CodeMode: {'✅ ' + self.code.code_path if self.code.is_code_mode else '⚪ Container mode'}")
|
|
609
|
+
lines.append(f" OTEL: {'✅ Enabled' if self.otel.is_enabled else '⚪ Disabled'}")
|
|
610
|
+
return "\n".join(lines)
|
|
611
|
+
|
|
612
|
+
def __repr__(self) -> str:
|
|
613
|
+
return self.summary()
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
# 全局单例
|
|
617
|
+
settings = Settings()
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
# ------------------
|
|
621
|
+
# 环境初始化工具
|
|
622
|
+
# ------------------
|
|
623
|
+
|
|
624
|
+
DEFAULT_RUNTIME_TIMEZONE = "Asia/Shanghai"
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
def setup_environment(agent_path: "Path"):
|
|
628
|
+
"""加载环境变量并注入智能默认配置
|
|
629
|
+
|
|
630
|
+
1. 加载项目根目录的 .env 文件 (override=True)
|
|
631
|
+
2. 注入 OPENAI_API_BASE (智能检测)
|
|
632
|
+
3. 注入 OPENAI_MODEL_NAME (默认值)
|
|
633
|
+
"""
|
|
634
|
+
import click
|
|
635
|
+
import os
|
|
636
|
+
from pathlib import Path
|
|
637
|
+
try:
|
|
638
|
+
from dotenv import load_dotenv
|
|
639
|
+
except ImportError:
|
|
640
|
+
# 如果没有安装 python-dotenv,则跳过 loading .env
|
|
641
|
+
load_dotenv = None
|
|
642
|
+
|
|
643
|
+
# 1. 加载 .env
|
|
644
|
+
if load_dotenv:
|
|
645
|
+
# Ensure agent_path is a Path object
|
|
646
|
+
if isinstance(agent_path, str):
|
|
647
|
+
agent_path = Path(agent_path)
|
|
648
|
+
|
|
649
|
+
env_file = agent_path / ".env"
|
|
650
|
+
if env_file.exists():
|
|
651
|
+
# override=False: 保留通过 API/Serverless 平台注入的环境变量 (优先级高)
|
|
652
|
+
load_dotenv(env_file, override=False)
|
|
653
|
+
|
|
654
|
+
# 本地调试与托管运行时统一默认北京时间;用户通过 shell/.env/平台显式指定 TZ 时不覆盖。
|
|
655
|
+
os.environ.setdefault("TZ", DEFAULT_RUNTIME_TIMEZONE)
|
|
656
|
+
if hasattr(time, "tzset"):
|
|
657
|
+
time.tzset()
|
|
658
|
+
|
|
659
|
+
# 1.5. 托管运行时里不要保留公网 KSPMAS 地址,否则用户代码优先读取 OPENAI_BASE_URL
|
|
660
|
+
# 会绕开后续的内网自动探测,导致 Serverless Pod 访问公网模型网关超时。
|
|
661
|
+
if _is_internal_runtime_env():
|
|
662
|
+
for env_key in ("OPENAI_BASE_URL", "OPENAI_API_BASE"):
|
|
663
|
+
raw_value = os.getenv(env_key, "")
|
|
664
|
+
if _is_public_kspmas_url(raw_value):
|
|
665
|
+
os.environ.pop(env_key, None)
|
|
666
|
+
|
|
667
|
+
# 2. Coze SDK 兼容映射
|
|
668
|
+
# 某些 Coze 导出项目(tool 内使用 coze_coding_dev_sdk)会强依赖 COZE_* 环境变量,
|
|
669
|
+
# 本地通常只配置了 OPENAI_*,这里做一次非覆盖式映射。
|
|
670
|
+
coze_api_key = os.getenv("COZE_WORKLOAD_IDENTITY_API_KEY")
|
|
671
|
+
coze_base_url = os.getenv("COZE_INTEGRATION_BASE_URL")
|
|
672
|
+
coze_model_base_url = os.getenv("COZE_INTEGRATION_MODEL_BASE_URL")
|
|
673
|
+
|
|
674
|
+
openai_api_key = _get_env("OPENAI_API_KEY", "LLM_API_KEY", "MODEL_API_KEY")
|
|
675
|
+
openai_base_url = _get_env(
|
|
676
|
+
"OPENAI_BASE_URL",
|
|
677
|
+
"OPENAI_API_BASE",
|
|
678
|
+
"LLM_API_BASE",
|
|
679
|
+
"MODEL_API_BASE",
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
if not coze_api_key and openai_api_key:
|
|
683
|
+
os.environ["COZE_WORKLOAD_IDENTITY_API_KEY"] = openai_api_key
|
|
684
|
+
if not coze_base_url and openai_base_url:
|
|
685
|
+
os.environ["COZE_INTEGRATION_BASE_URL"] = openai_base_url
|
|
686
|
+
if not coze_model_base_url and openai_base_url:
|
|
687
|
+
os.environ["COZE_INTEGRATION_MODEL_BASE_URL"] = openai_base_url
|
|
688
|
+
|
|
689
|
+
# 3. 注入 Intelligent Defaults
|
|
690
|
+
# API Base. 兼容 OpenAI SDK/LangChain 常见的 OPENAI_BASE_URL 与历史 OPENAI_API_BASE。
|
|
691
|
+
if not os.getenv("OPENAI_BASE_URL") or not os.getenv("OPENAI_API_BASE"):
|
|
692
|
+
api_base = settings.model.api_base
|
|
693
|
+
if api_base:
|
|
694
|
+
if not os.getenv("OPENAI_BASE_URL"):
|
|
695
|
+
os.environ["OPENAI_BASE_URL"] = api_base
|
|
696
|
+
if not os.getenv("OPENAI_API_BASE"):
|
|
697
|
+
os.environ["OPENAI_API_BASE"] = api_base
|
|
698
|
+
click.echo(f"🔧 API Base: {click.style(api_base, fg='cyan')} (Auto-detected)")
|
|
699
|
+
|
|
700
|
+
# Model Name
|
|
701
|
+
if not os.getenv("OPENAI_MODEL_NAME"):
|
|
702
|
+
model_name = settings.model.model_name
|
|
703
|
+
os.environ["OPENAI_MODEL_NAME"] = model_name
|
|
704
|
+
click.echo(f"🧠 Model: {click.style(model_name, fg='cyan')} (Default)")
|
|
705
|
+
if not os.getenv("MODEL_NAME") and os.getenv("OPENAI_MODEL_NAME"):
|
|
706
|
+
os.environ["MODEL_NAME"] = os.getenv("OPENAI_MODEL_NAME", "")
|