amd-gaia 0.14.1__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.
- amd_gaia-0.14.1.dist-info/METADATA +768 -0
- amd_gaia-0.14.1.dist-info/RECORD +800 -0
- amd_gaia-0.14.1.dist-info/WHEEL +5 -0
- amd_gaia-0.14.1.dist-info/entry_points.txt +5 -0
- amd_gaia-0.14.1.dist-info/licenses/LICENSE.md +21 -0
- amd_gaia-0.14.1.dist-info/top_level.txt +1 -0
- gaia/__init__.py +2 -0
- gaia/agents/__init__.py +19 -0
- gaia/agents/base/__init__.py +9 -0
- gaia/agents/base/agent.py +2072 -0
- gaia/agents/base/api_agent.py +120 -0
- gaia/agents/base/console.py +1457 -0
- gaia/agents/base/mcp_agent.py +86 -0
- gaia/agents/base/tools.py +83 -0
- gaia/agents/blender/agent.py +556 -0
- gaia/agents/blender/agent_simple.py +135 -0
- gaia/agents/blender/app.py +211 -0
- gaia/agents/blender/app_simple.py +41 -0
- gaia/agents/blender/core/__init__.py +16 -0
- gaia/agents/blender/core/materials.py +506 -0
- gaia/agents/blender/core/objects.py +316 -0
- gaia/agents/blender/core/rendering.py +225 -0
- gaia/agents/blender/core/scene.py +220 -0
- gaia/agents/blender/core/view.py +146 -0
- gaia/agents/chat/__init__.py +9 -0
- gaia/agents/chat/agent.py +975 -0
- gaia/agents/chat/app.py +1058 -0
- gaia/agents/chat/session.py +508 -0
- gaia/agents/chat/tools/__init__.py +15 -0
- gaia/agents/chat/tools/file_tools.py +96 -0
- gaia/agents/chat/tools/rag_tools.py +1729 -0
- gaia/agents/chat/tools/shell_tools.py +436 -0
- gaia/agents/code/__init__.py +7 -0
- gaia/agents/code/agent.py +547 -0
- gaia/agents/code/app.py +266 -0
- gaia/agents/code/models.py +135 -0
- gaia/agents/code/orchestration/__init__.py +24 -0
- gaia/agents/code/orchestration/checklist_executor.py +1739 -0
- gaia/agents/code/orchestration/checklist_generator.py +709 -0
- gaia/agents/code/orchestration/factories/__init__.py +9 -0
- gaia/agents/code/orchestration/factories/base.py +63 -0
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -0
- gaia/agents/code/orchestration/factories/python_factory.py +106 -0
- gaia/agents/code/orchestration/orchestrator.py +610 -0
- gaia/agents/code/orchestration/project_analyzer.py +391 -0
- gaia/agents/code/orchestration/steps/__init__.py +67 -0
- gaia/agents/code/orchestration/steps/base.py +188 -0
- gaia/agents/code/orchestration/steps/error_handler.py +314 -0
- gaia/agents/code/orchestration/steps/nextjs.py +828 -0
- gaia/agents/code/orchestration/steps/python.py +307 -0
- gaia/agents/code/orchestration/template_catalog.py +463 -0
- gaia/agents/code/orchestration/workflows/__init__.py +14 -0
- gaia/agents/code/orchestration/workflows/base.py +80 -0
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -0
- gaia/agents/code/orchestration/workflows/python.py +94 -0
- gaia/agents/code/prompts/__init__.py +11 -0
- gaia/agents/code/prompts/base_prompt.py +77 -0
- gaia/agents/code/prompts/code_patterns.py +1925 -0
- gaia/agents/code/prompts/nextjs_prompt.py +40 -0
- gaia/agents/code/prompts/python_prompt.py +109 -0
- gaia/agents/code/schema_inference.py +365 -0
- gaia/agents/code/system_prompt.py +41 -0
- gaia/agents/code/tools/__init__.py +42 -0
- gaia/agents/code/tools/cli_tools.py +1138 -0
- gaia/agents/code/tools/code_formatting.py +319 -0
- gaia/agents/code/tools/code_tools.py +769 -0
- gaia/agents/code/tools/error_fixing.py +1347 -0
- gaia/agents/code/tools/external_tools.py +180 -0
- gaia/agents/code/tools/file_io.py +845 -0
- gaia/agents/code/tools/prisma_tools.py +190 -0
- gaia/agents/code/tools/project_management.py +1016 -0
- gaia/agents/code/tools/testing.py +321 -0
- gaia/agents/code/tools/typescript_tools.py +122 -0
- gaia/agents/code/tools/validation_parsing.py +461 -0
- gaia/agents/code/tools/validation_tools.py +803 -0
- gaia/agents/code/tools/web_dev_tools.py +1744 -0
- gaia/agents/code/validators/__init__.py +16 -0
- gaia/agents/code/validators/antipattern_checker.py +241 -0
- gaia/agents/code/validators/ast_analyzer.py +197 -0
- gaia/agents/code/validators/requirements_validator.py +145 -0
- gaia/agents/code/validators/syntax_validator.py +171 -0
- gaia/agents/docker/__init__.py +7 -0
- gaia/agents/docker/agent.py +642 -0
- gaia/agents/jira/__init__.py +11 -0
- gaia/agents/jira/agent.py +894 -0
- gaia/agents/jira/jql_templates.py +299 -0
- gaia/agents/routing/__init__.py +7 -0
- gaia/agents/routing/agent.py +512 -0
- gaia/agents/routing/system_prompt.py +75 -0
- gaia/api/__init__.py +23 -0
- gaia/api/agent_registry.py +238 -0
- gaia/api/app.py +305 -0
- gaia/api/openai_server.py +575 -0
- gaia/api/schemas.py +186 -0
- gaia/api/sse_handler.py +370 -0
- gaia/apps/__init__.py +4 -0
- gaia/apps/llm/__init__.py +6 -0
- gaia/apps/llm/app.py +169 -0
- gaia/apps/summarize/app.py +633 -0
- gaia/apps/summarize/html_viewer.py +133 -0
- gaia/apps/summarize/pdf_formatter.py +284 -0
- gaia/audio/__init__.py +2 -0
- gaia/audio/audio_client.py +439 -0
- gaia/audio/audio_recorder.py +269 -0
- gaia/audio/kokoro_tts.py +599 -0
- gaia/audio/whisper_asr.py +432 -0
- gaia/chat/__init__.py +16 -0
- gaia/chat/app.py +430 -0
- gaia/chat/prompts.py +522 -0
- gaia/chat/sdk.py +1200 -0
- gaia/cli.py +5621 -0
- gaia/eval/batch_experiment.py +2332 -0
- gaia/eval/claude.py +542 -0
- gaia/eval/config.py +37 -0
- gaia/eval/email_generator.py +512 -0
- gaia/eval/eval.py +3179 -0
- gaia/eval/groundtruth.py +1130 -0
- gaia/eval/transcript_generator.py +582 -0
- gaia/eval/webapp/README.md +168 -0
- gaia/eval/webapp/node_modules/.bin/mime +16 -0
- gaia/eval/webapp/node_modules/.bin/mime.cmd +17 -0
- gaia/eval/webapp/node_modules/.bin/mime.ps1 +28 -0
- gaia/eval/webapp/node_modules/.package-lock.json +865 -0
- gaia/eval/webapp/node_modules/accepts/HISTORY.md +243 -0
- gaia/eval/webapp/node_modules/accepts/LICENSE +23 -0
- gaia/eval/webapp/node_modules/accepts/README.md +140 -0
- gaia/eval/webapp/node_modules/accepts/index.js +238 -0
- gaia/eval/webapp/node_modules/accepts/package.json +47 -0
- gaia/eval/webapp/node_modules/array-flatten/LICENSE +21 -0
- gaia/eval/webapp/node_modules/array-flatten/README.md +43 -0
- gaia/eval/webapp/node_modules/array-flatten/array-flatten.js +64 -0
- gaia/eval/webapp/node_modules/array-flatten/package.json +39 -0
- gaia/eval/webapp/node_modules/body-parser/HISTORY.md +672 -0
- gaia/eval/webapp/node_modules/body-parser/LICENSE +23 -0
- gaia/eval/webapp/node_modules/body-parser/README.md +476 -0
- gaia/eval/webapp/node_modules/body-parser/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/body-parser/index.js +156 -0
- gaia/eval/webapp/node_modules/body-parser/lib/read.js +205 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/json.js +247 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/raw.js +101 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/text.js +121 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/urlencoded.js +307 -0
- gaia/eval/webapp/node_modules/body-parser/package.json +56 -0
- gaia/eval/webapp/node_modules/bytes/History.md +97 -0
- gaia/eval/webapp/node_modules/bytes/LICENSE +23 -0
- gaia/eval/webapp/node_modules/bytes/Readme.md +152 -0
- gaia/eval/webapp/node_modules/bytes/index.js +170 -0
- gaia/eval/webapp/node_modules/bytes/package.json +42 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.nycrc +9 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/README.md +62 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.js +15 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/package.json +85 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/test/index.js +63 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/call-bound/.eslintrc +13 -0
- gaia/eval/webapp/node_modules/call-bound/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/call-bound/.nycrc +9 -0
- gaia/eval/webapp/node_modules/call-bound/CHANGELOG.md +42 -0
- gaia/eval/webapp/node_modules/call-bound/LICENSE +21 -0
- gaia/eval/webapp/node_modules/call-bound/README.md +53 -0
- gaia/eval/webapp/node_modules/call-bound/index.d.ts +94 -0
- gaia/eval/webapp/node_modules/call-bound/index.js +19 -0
- gaia/eval/webapp/node_modules/call-bound/package.json +99 -0
- gaia/eval/webapp/node_modules/call-bound/test/index.js +61 -0
- gaia/eval/webapp/node_modules/call-bound/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/content-disposition/HISTORY.md +60 -0
- gaia/eval/webapp/node_modules/content-disposition/LICENSE +22 -0
- gaia/eval/webapp/node_modules/content-disposition/README.md +142 -0
- gaia/eval/webapp/node_modules/content-disposition/index.js +458 -0
- gaia/eval/webapp/node_modules/content-disposition/package.json +44 -0
- gaia/eval/webapp/node_modules/content-type/HISTORY.md +29 -0
- gaia/eval/webapp/node_modules/content-type/LICENSE +22 -0
- gaia/eval/webapp/node_modules/content-type/README.md +94 -0
- gaia/eval/webapp/node_modules/content-type/index.js +225 -0
- gaia/eval/webapp/node_modules/content-type/package.json +42 -0
- gaia/eval/webapp/node_modules/cookie/LICENSE +24 -0
- gaia/eval/webapp/node_modules/cookie/README.md +317 -0
- gaia/eval/webapp/node_modules/cookie/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/cookie/index.js +334 -0
- gaia/eval/webapp/node_modules/cookie/package.json +44 -0
- gaia/eval/webapp/node_modules/cookie-signature/.npmignore +4 -0
- gaia/eval/webapp/node_modules/cookie-signature/History.md +38 -0
- gaia/eval/webapp/node_modules/cookie-signature/Readme.md +42 -0
- gaia/eval/webapp/node_modules/cookie-signature/index.js +51 -0
- gaia/eval/webapp/node_modules/cookie-signature/package.json +18 -0
- gaia/eval/webapp/node_modules/debug/.coveralls.yml +1 -0
- gaia/eval/webapp/node_modules/debug/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/debug/.npmignore +9 -0
- gaia/eval/webapp/node_modules/debug/.travis.yml +14 -0
- gaia/eval/webapp/node_modules/debug/CHANGELOG.md +362 -0
- gaia/eval/webapp/node_modules/debug/LICENSE +19 -0
- gaia/eval/webapp/node_modules/debug/Makefile +50 -0
- gaia/eval/webapp/node_modules/debug/README.md +312 -0
- gaia/eval/webapp/node_modules/debug/component.json +19 -0
- gaia/eval/webapp/node_modules/debug/karma.conf.js +70 -0
- gaia/eval/webapp/node_modules/debug/node.js +1 -0
- gaia/eval/webapp/node_modules/debug/package.json +49 -0
- gaia/eval/webapp/node_modules/debug/src/browser.js +185 -0
- gaia/eval/webapp/node_modules/debug/src/debug.js +202 -0
- gaia/eval/webapp/node_modules/debug/src/index.js +10 -0
- gaia/eval/webapp/node_modules/debug/src/inspector-log.js +15 -0
- gaia/eval/webapp/node_modules/debug/src/node.js +248 -0
- gaia/eval/webapp/node_modules/depd/History.md +103 -0
- gaia/eval/webapp/node_modules/depd/LICENSE +22 -0
- gaia/eval/webapp/node_modules/depd/Readme.md +280 -0
- gaia/eval/webapp/node_modules/depd/index.js +538 -0
- gaia/eval/webapp/node_modules/depd/lib/browser/index.js +77 -0
- gaia/eval/webapp/node_modules/depd/package.json +45 -0
- gaia/eval/webapp/node_modules/destroy/LICENSE +23 -0
- gaia/eval/webapp/node_modules/destroy/README.md +63 -0
- gaia/eval/webapp/node_modules/destroy/index.js +209 -0
- gaia/eval/webapp/node_modules/destroy/package.json +48 -0
- gaia/eval/webapp/node_modules/dunder-proto/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/dunder-proto/.nycrc +13 -0
- gaia/eval/webapp/node_modules/dunder-proto/CHANGELOG.md +24 -0
- gaia/eval/webapp/node_modules/dunder-proto/LICENSE +21 -0
- gaia/eval/webapp/node_modules/dunder-proto/README.md +54 -0
- gaia/eval/webapp/node_modules/dunder-proto/get.d.ts +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/get.js +30 -0
- gaia/eval/webapp/node_modules/dunder-proto/package.json +76 -0
- gaia/eval/webapp/node_modules/dunder-proto/set.d.ts +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/set.js +35 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/get.js +34 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/index.js +4 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/set.js +50 -0
- gaia/eval/webapp/node_modules/dunder-proto/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/ee-first/LICENSE +22 -0
- gaia/eval/webapp/node_modules/ee-first/README.md +80 -0
- gaia/eval/webapp/node_modules/ee-first/index.js +95 -0
- gaia/eval/webapp/node_modules/ee-first/package.json +29 -0
- gaia/eval/webapp/node_modules/encodeurl/LICENSE +22 -0
- gaia/eval/webapp/node_modules/encodeurl/README.md +109 -0
- gaia/eval/webapp/node_modules/encodeurl/index.js +60 -0
- gaia/eval/webapp/node_modules/encodeurl/package.json +40 -0
- gaia/eval/webapp/node_modules/es-define-property/.eslintrc +13 -0
- gaia/eval/webapp/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-define-property/.nycrc +9 -0
- gaia/eval/webapp/node_modules/es-define-property/CHANGELOG.md +29 -0
- gaia/eval/webapp/node_modules/es-define-property/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-define-property/README.md +49 -0
- gaia/eval/webapp/node_modules/es-define-property/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-define-property/index.js +14 -0
- gaia/eval/webapp/node_modules/es-define-property/package.json +81 -0
- gaia/eval/webapp/node_modules/es-define-property/test/index.js +56 -0
- gaia/eval/webapp/node_modules/es-define-property/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/es-errors/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/es-errors/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-errors/CHANGELOG.md +40 -0
- gaia/eval/webapp/node_modules/es-errors/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-errors/README.md +55 -0
- gaia/eval/webapp/node_modules/es-errors/eval.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/eval.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/index.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/package.json +80 -0
- gaia/eval/webapp/node_modules/es-errors/range.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/range.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/ref.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/ref.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/syntax.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/syntax.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/test/index.js +19 -0
- gaia/eval/webapp/node_modules/es-errors/tsconfig.json +49 -0
- gaia/eval/webapp/node_modules/es-errors/type.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/type.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/uri.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/uri.js +4 -0
- gaia/eval/webapp/node_modules/es-object-atoms/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-object-atoms/CHANGELOG.md +37 -0
- gaia/eval/webapp/node_modules/es-object-atoms/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-object-atoms/README.md +63 -0
- gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- gaia/eval/webapp/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- gaia/eval/webapp/node_modules/es-object-atoms/ToObject.js +10 -0
- gaia/eval/webapp/node_modules/es-object-atoms/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/index.js +4 -0
- gaia/eval/webapp/node_modules/es-object-atoms/isObject.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/isObject.js +6 -0
- gaia/eval/webapp/node_modules/es-object-atoms/package.json +80 -0
- gaia/eval/webapp/node_modules/es-object-atoms/test/index.js +38 -0
- gaia/eval/webapp/node_modules/es-object-atoms/tsconfig.json +6 -0
- gaia/eval/webapp/node_modules/escape-html/LICENSE +24 -0
- gaia/eval/webapp/node_modules/escape-html/Readme.md +43 -0
- gaia/eval/webapp/node_modules/escape-html/index.js +78 -0
- gaia/eval/webapp/node_modules/escape-html/package.json +24 -0
- gaia/eval/webapp/node_modules/etag/HISTORY.md +83 -0
- gaia/eval/webapp/node_modules/etag/LICENSE +22 -0
- gaia/eval/webapp/node_modules/etag/README.md +159 -0
- gaia/eval/webapp/node_modules/etag/index.js +131 -0
- gaia/eval/webapp/node_modules/etag/package.json +47 -0
- gaia/eval/webapp/node_modules/express/History.md +3656 -0
- gaia/eval/webapp/node_modules/express/LICENSE +24 -0
- gaia/eval/webapp/node_modules/express/Readme.md +260 -0
- gaia/eval/webapp/node_modules/express/index.js +11 -0
- gaia/eval/webapp/node_modules/express/lib/application.js +661 -0
- gaia/eval/webapp/node_modules/express/lib/express.js +116 -0
- gaia/eval/webapp/node_modules/express/lib/middleware/init.js +43 -0
- gaia/eval/webapp/node_modules/express/lib/middleware/query.js +47 -0
- gaia/eval/webapp/node_modules/express/lib/request.js +525 -0
- gaia/eval/webapp/node_modules/express/lib/response.js +1179 -0
- gaia/eval/webapp/node_modules/express/lib/router/index.js +673 -0
- gaia/eval/webapp/node_modules/express/lib/router/layer.js +181 -0
- gaia/eval/webapp/node_modules/express/lib/router/route.js +230 -0
- gaia/eval/webapp/node_modules/express/lib/utils.js +303 -0
- gaia/eval/webapp/node_modules/express/lib/view.js +182 -0
- gaia/eval/webapp/node_modules/express/package.json +102 -0
- gaia/eval/webapp/node_modules/finalhandler/HISTORY.md +210 -0
- gaia/eval/webapp/node_modules/finalhandler/LICENSE +22 -0
- gaia/eval/webapp/node_modules/finalhandler/README.md +147 -0
- gaia/eval/webapp/node_modules/finalhandler/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/finalhandler/index.js +341 -0
- gaia/eval/webapp/node_modules/finalhandler/package.json +47 -0
- gaia/eval/webapp/node_modules/forwarded/HISTORY.md +21 -0
- gaia/eval/webapp/node_modules/forwarded/LICENSE +22 -0
- gaia/eval/webapp/node_modules/forwarded/README.md +57 -0
- gaia/eval/webapp/node_modules/forwarded/index.js +90 -0
- gaia/eval/webapp/node_modules/forwarded/package.json +45 -0
- gaia/eval/webapp/node_modules/fresh/HISTORY.md +70 -0
- gaia/eval/webapp/node_modules/fresh/LICENSE +23 -0
- gaia/eval/webapp/node_modules/fresh/README.md +119 -0
- gaia/eval/webapp/node_modules/fresh/index.js +137 -0
- gaia/eval/webapp/node_modules/fresh/package.json +46 -0
- gaia/eval/webapp/node_modules/fs/README.md +9 -0
- gaia/eval/webapp/node_modules/fs/package.json +20 -0
- gaia/eval/webapp/node_modules/function-bind/.eslintrc +21 -0
- gaia/eval/webapp/node_modules/function-bind/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/function-bind/.github/SECURITY.md +3 -0
- gaia/eval/webapp/node_modules/function-bind/.nycrc +13 -0
- gaia/eval/webapp/node_modules/function-bind/CHANGELOG.md +136 -0
- gaia/eval/webapp/node_modules/function-bind/LICENSE +20 -0
- gaia/eval/webapp/node_modules/function-bind/README.md +46 -0
- gaia/eval/webapp/node_modules/function-bind/implementation.js +84 -0
- gaia/eval/webapp/node_modules/function-bind/index.js +5 -0
- gaia/eval/webapp/node_modules/function-bind/package.json +87 -0
- gaia/eval/webapp/node_modules/function-bind/test/.eslintrc +9 -0
- gaia/eval/webapp/node_modules/function-bind/test/index.js +252 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.eslintrc +42 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.nycrc +9 -0
- gaia/eval/webapp/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- gaia/eval/webapp/node_modules/get-intrinsic/LICENSE +21 -0
- gaia/eval/webapp/node_modules/get-intrinsic/README.md +71 -0
- gaia/eval/webapp/node_modules/get-intrinsic/index.js +378 -0
- gaia/eval/webapp/node_modules/get-intrinsic/package.json +97 -0
- gaia/eval/webapp/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
- gaia/eval/webapp/node_modules/get-proto/.eslintrc +10 -0
- gaia/eval/webapp/node_modules/get-proto/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/get-proto/.nycrc +9 -0
- gaia/eval/webapp/node_modules/get-proto/CHANGELOG.md +21 -0
- gaia/eval/webapp/node_modules/get-proto/LICENSE +21 -0
- gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- gaia/eval/webapp/node_modules/get-proto/README.md +50 -0
- gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- gaia/eval/webapp/node_modules/get-proto/index.d.ts +5 -0
- gaia/eval/webapp/node_modules/get-proto/index.js +27 -0
- gaia/eval/webapp/node_modules/get-proto/package.json +81 -0
- gaia/eval/webapp/node_modules/get-proto/test/index.js +68 -0
- gaia/eval/webapp/node_modules/get-proto/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/gopd/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/gopd/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/gopd/CHANGELOG.md +45 -0
- gaia/eval/webapp/node_modules/gopd/LICENSE +21 -0
- gaia/eval/webapp/node_modules/gopd/README.md +40 -0
- gaia/eval/webapp/node_modules/gopd/gOPD.d.ts +1 -0
- gaia/eval/webapp/node_modules/gopd/gOPD.js +4 -0
- gaia/eval/webapp/node_modules/gopd/index.d.ts +5 -0
- gaia/eval/webapp/node_modules/gopd/index.js +15 -0
- gaia/eval/webapp/node_modules/gopd/package.json +77 -0
- gaia/eval/webapp/node_modules/gopd/test/index.js +36 -0
- gaia/eval/webapp/node_modules/gopd/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/has-symbols/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/has-symbols/.nycrc +9 -0
- gaia/eval/webapp/node_modules/has-symbols/CHANGELOG.md +91 -0
- gaia/eval/webapp/node_modules/has-symbols/LICENSE +21 -0
- gaia/eval/webapp/node_modules/has-symbols/README.md +46 -0
- gaia/eval/webapp/node_modules/has-symbols/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/has-symbols/index.js +14 -0
- gaia/eval/webapp/node_modules/has-symbols/package.json +111 -0
- gaia/eval/webapp/node_modules/has-symbols/shams.d.ts +3 -0
- gaia/eval/webapp/node_modules/has-symbols/shams.js +45 -0
- gaia/eval/webapp/node_modules/has-symbols/test/index.js +22 -0
- gaia/eval/webapp/node_modules/has-symbols/test/shams/core-js.js +29 -0
- gaia/eval/webapp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
- gaia/eval/webapp/node_modules/has-symbols/test/tests.js +58 -0
- gaia/eval/webapp/node_modules/has-symbols/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/hasown/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/hasown/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/hasown/.nycrc +13 -0
- gaia/eval/webapp/node_modules/hasown/CHANGELOG.md +40 -0
- gaia/eval/webapp/node_modules/hasown/LICENSE +21 -0
- gaia/eval/webapp/node_modules/hasown/README.md +40 -0
- gaia/eval/webapp/node_modules/hasown/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/hasown/index.js +8 -0
- gaia/eval/webapp/node_modules/hasown/package.json +92 -0
- gaia/eval/webapp/node_modules/hasown/tsconfig.json +6 -0
- gaia/eval/webapp/node_modules/http-errors/HISTORY.md +180 -0
- gaia/eval/webapp/node_modules/http-errors/LICENSE +23 -0
- gaia/eval/webapp/node_modules/http-errors/README.md +169 -0
- gaia/eval/webapp/node_modules/http-errors/index.js +289 -0
- gaia/eval/webapp/node_modules/http-errors/package.json +50 -0
- gaia/eval/webapp/node_modules/iconv-lite/Changelog.md +162 -0
- gaia/eval/webapp/node_modules/iconv-lite/LICENSE +21 -0
- gaia/eval/webapp/node_modules/iconv-lite/README.md +156 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/index.js +22 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/internal.js +188 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/utf16.js +177 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/utf7.js +290 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/bom-handling.js +52 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/extend-node.js +217 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/index.d.ts +24 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/index.js +153 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/streams.js +121 -0
- gaia/eval/webapp/node_modules/iconv-lite/package.json +46 -0
- gaia/eval/webapp/node_modules/inherits/LICENSE +16 -0
- gaia/eval/webapp/node_modules/inherits/README.md +42 -0
- gaia/eval/webapp/node_modules/inherits/inherits.js +9 -0
- gaia/eval/webapp/node_modules/inherits/inherits_browser.js +27 -0
- gaia/eval/webapp/node_modules/inherits/package.json +29 -0
- gaia/eval/webapp/node_modules/ipaddr.js/LICENSE +19 -0
- gaia/eval/webapp/node_modules/ipaddr.js/README.md +233 -0
- gaia/eval/webapp/node_modules/ipaddr.js/ipaddr.min.js +1 -0
- gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
- gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
- gaia/eval/webapp/node_modules/ipaddr.js/package.json +35 -0
- gaia/eval/webapp/node_modules/math-intrinsics/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- gaia/eval/webapp/node_modules/math-intrinsics/LICENSE +21 -0
- gaia/eval/webapp/node_modules/math-intrinsics/README.md +50 -0
- gaia/eval/webapp/node_modules/math-intrinsics/abs.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/abs.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- gaia/eval/webapp/node_modules/math-intrinsics/floor.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/floor.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isFinite.js +12 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isInteger.js +16 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNaN.js +6 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- gaia/eval/webapp/node_modules/math-intrinsics/max.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/max.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/min.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/min.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/mod.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/mod.js +9 -0
- gaia/eval/webapp/node_modules/math-intrinsics/package.json +86 -0
- gaia/eval/webapp/node_modules/math-intrinsics/pow.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/pow.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/round.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/round.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/sign.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/sign.js +11 -0
- gaia/eval/webapp/node_modules/math-intrinsics/test/index.js +192 -0
- gaia/eval/webapp/node_modules/math-intrinsics/tsconfig.json +3 -0
- gaia/eval/webapp/node_modules/media-typer/HISTORY.md +22 -0
- gaia/eval/webapp/node_modules/media-typer/LICENSE +22 -0
- gaia/eval/webapp/node_modules/media-typer/README.md +81 -0
- gaia/eval/webapp/node_modules/media-typer/index.js +270 -0
- gaia/eval/webapp/node_modules/media-typer/package.json +26 -0
- gaia/eval/webapp/node_modules/merge-descriptors/HISTORY.md +21 -0
- gaia/eval/webapp/node_modules/merge-descriptors/LICENSE +23 -0
- gaia/eval/webapp/node_modules/merge-descriptors/README.md +49 -0
- gaia/eval/webapp/node_modules/merge-descriptors/index.js +60 -0
- gaia/eval/webapp/node_modules/merge-descriptors/package.json +39 -0
- gaia/eval/webapp/node_modules/methods/HISTORY.md +29 -0
- gaia/eval/webapp/node_modules/methods/LICENSE +24 -0
- gaia/eval/webapp/node_modules/methods/README.md +51 -0
- gaia/eval/webapp/node_modules/methods/index.js +69 -0
- gaia/eval/webapp/node_modules/methods/package.json +36 -0
- gaia/eval/webapp/node_modules/mime/.npmignore +0 -0
- gaia/eval/webapp/node_modules/mime/CHANGELOG.md +164 -0
- gaia/eval/webapp/node_modules/mime/LICENSE +21 -0
- gaia/eval/webapp/node_modules/mime/README.md +90 -0
- gaia/eval/webapp/node_modules/mime/cli.js +8 -0
- gaia/eval/webapp/node_modules/mime/mime.js +108 -0
- gaia/eval/webapp/node_modules/mime/package.json +44 -0
- gaia/eval/webapp/node_modules/mime/src/build.js +53 -0
- gaia/eval/webapp/node_modules/mime/src/test.js +60 -0
- gaia/eval/webapp/node_modules/mime/types.json +1 -0
- gaia/eval/webapp/node_modules/mime-db/HISTORY.md +507 -0
- gaia/eval/webapp/node_modules/mime-db/LICENSE +23 -0
- gaia/eval/webapp/node_modules/mime-db/README.md +100 -0
- gaia/eval/webapp/node_modules/mime-db/db.json +8519 -0
- gaia/eval/webapp/node_modules/mime-db/index.js +12 -0
- gaia/eval/webapp/node_modules/mime-db/package.json +60 -0
- gaia/eval/webapp/node_modules/mime-types/HISTORY.md +397 -0
- gaia/eval/webapp/node_modules/mime-types/LICENSE +23 -0
- gaia/eval/webapp/node_modules/mime-types/README.md +113 -0
- gaia/eval/webapp/node_modules/mime-types/index.js +188 -0
- gaia/eval/webapp/node_modules/mime-types/package.json +44 -0
- gaia/eval/webapp/node_modules/ms/index.js +152 -0
- gaia/eval/webapp/node_modules/ms/license.md +21 -0
- gaia/eval/webapp/node_modules/ms/package.json +37 -0
- gaia/eval/webapp/node_modules/ms/readme.md +51 -0
- gaia/eval/webapp/node_modules/negotiator/HISTORY.md +108 -0
- gaia/eval/webapp/node_modules/negotiator/LICENSE +24 -0
- gaia/eval/webapp/node_modules/negotiator/README.md +203 -0
- gaia/eval/webapp/node_modules/negotiator/index.js +82 -0
- gaia/eval/webapp/node_modules/negotiator/lib/charset.js +169 -0
- gaia/eval/webapp/node_modules/negotiator/lib/encoding.js +184 -0
- gaia/eval/webapp/node_modules/negotiator/lib/language.js +179 -0
- gaia/eval/webapp/node_modules/negotiator/lib/mediaType.js +294 -0
- gaia/eval/webapp/node_modules/negotiator/package.json +42 -0
- gaia/eval/webapp/node_modules/object-inspect/.eslintrc +53 -0
- gaia/eval/webapp/node_modules/object-inspect/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/object-inspect/.nycrc +13 -0
- gaia/eval/webapp/node_modules/object-inspect/CHANGELOG.md +424 -0
- gaia/eval/webapp/node_modules/object-inspect/LICENSE +21 -0
- gaia/eval/webapp/node_modules/object-inspect/example/all.js +23 -0
- gaia/eval/webapp/node_modules/object-inspect/example/circular.js +6 -0
- gaia/eval/webapp/node_modules/object-inspect/example/fn.js +5 -0
- gaia/eval/webapp/node_modules/object-inspect/example/inspect.js +10 -0
- gaia/eval/webapp/node_modules/object-inspect/index.js +544 -0
- gaia/eval/webapp/node_modules/object-inspect/package-support.json +20 -0
- gaia/eval/webapp/node_modules/object-inspect/package.json +105 -0
- gaia/eval/webapp/node_modules/object-inspect/readme.markdown +84 -0
- gaia/eval/webapp/node_modules/object-inspect/test/bigint.js +58 -0
- gaia/eval/webapp/node_modules/object-inspect/test/browser/dom.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/circular.js +16 -0
- gaia/eval/webapp/node_modules/object-inspect/test/deep.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/element.js +53 -0
- gaia/eval/webapp/node_modules/object-inspect/test/err.js +48 -0
- gaia/eval/webapp/node_modules/object-inspect/test/fakes.js +29 -0
- gaia/eval/webapp/node_modules/object-inspect/test/fn.js +76 -0
- gaia/eval/webapp/node_modules/object-inspect/test/global.js +17 -0
- gaia/eval/webapp/node_modules/object-inspect/test/has.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/holes.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/indent-option.js +271 -0
- gaia/eval/webapp/node_modules/object-inspect/test/inspect.js +139 -0
- gaia/eval/webapp/node_modules/object-inspect/test/lowbyte.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/number.js +58 -0
- gaia/eval/webapp/node_modules/object-inspect/test/quoteStyle.js +26 -0
- gaia/eval/webapp/node_modules/object-inspect/test/toStringTag.js +40 -0
- gaia/eval/webapp/node_modules/object-inspect/test/undef.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/values.js +261 -0
- gaia/eval/webapp/node_modules/object-inspect/test-core-js.js +26 -0
- gaia/eval/webapp/node_modules/object-inspect/util.inspect.js +1 -0
- gaia/eval/webapp/node_modules/on-finished/HISTORY.md +98 -0
- gaia/eval/webapp/node_modules/on-finished/LICENSE +23 -0
- gaia/eval/webapp/node_modules/on-finished/README.md +162 -0
- gaia/eval/webapp/node_modules/on-finished/index.js +234 -0
- gaia/eval/webapp/node_modules/on-finished/package.json +39 -0
- gaia/eval/webapp/node_modules/parseurl/HISTORY.md +58 -0
- gaia/eval/webapp/node_modules/parseurl/LICENSE +24 -0
- gaia/eval/webapp/node_modules/parseurl/README.md +133 -0
- gaia/eval/webapp/node_modules/parseurl/index.js +158 -0
- gaia/eval/webapp/node_modules/parseurl/package.json +40 -0
- gaia/eval/webapp/node_modules/path/.npmignore +1 -0
- gaia/eval/webapp/node_modules/path/LICENSE +18 -0
- gaia/eval/webapp/node_modules/path/README.md +15 -0
- gaia/eval/webapp/node_modules/path/package.json +24 -0
- gaia/eval/webapp/node_modules/path/path.js +628 -0
- gaia/eval/webapp/node_modules/path-to-regexp/LICENSE +21 -0
- gaia/eval/webapp/node_modules/path-to-regexp/Readme.md +35 -0
- gaia/eval/webapp/node_modules/path-to-regexp/index.js +156 -0
- gaia/eval/webapp/node_modules/path-to-regexp/package.json +30 -0
- gaia/eval/webapp/node_modules/process/.eslintrc +21 -0
- gaia/eval/webapp/node_modules/process/LICENSE +22 -0
- gaia/eval/webapp/node_modules/process/README.md +26 -0
- gaia/eval/webapp/node_modules/process/browser.js +184 -0
- gaia/eval/webapp/node_modules/process/index.js +2 -0
- gaia/eval/webapp/node_modules/process/package.json +27 -0
- gaia/eval/webapp/node_modules/process/test.js +199 -0
- gaia/eval/webapp/node_modules/proxy-addr/HISTORY.md +161 -0
- gaia/eval/webapp/node_modules/proxy-addr/LICENSE +22 -0
- gaia/eval/webapp/node_modules/proxy-addr/README.md +139 -0
- gaia/eval/webapp/node_modules/proxy-addr/index.js +327 -0
- gaia/eval/webapp/node_modules/proxy-addr/package.json +47 -0
- gaia/eval/webapp/node_modules/qs/.editorconfig +46 -0
- gaia/eval/webapp/node_modules/qs/.eslintrc +38 -0
- gaia/eval/webapp/node_modules/qs/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/qs/.nycrc +13 -0
- gaia/eval/webapp/node_modules/qs/CHANGELOG.md +600 -0
- gaia/eval/webapp/node_modules/qs/LICENSE.md +29 -0
- gaia/eval/webapp/node_modules/qs/README.md +709 -0
- gaia/eval/webapp/node_modules/qs/dist/qs.js +90 -0
- gaia/eval/webapp/node_modules/qs/lib/formats.js +23 -0
- gaia/eval/webapp/node_modules/qs/lib/index.js +11 -0
- gaia/eval/webapp/node_modules/qs/lib/parse.js +296 -0
- gaia/eval/webapp/node_modules/qs/lib/stringify.js +351 -0
- gaia/eval/webapp/node_modules/qs/lib/utils.js +265 -0
- gaia/eval/webapp/node_modules/qs/package.json +91 -0
- gaia/eval/webapp/node_modules/qs/test/empty-keys-cases.js +267 -0
- gaia/eval/webapp/node_modules/qs/test/parse.js +1170 -0
- gaia/eval/webapp/node_modules/qs/test/stringify.js +1298 -0
- gaia/eval/webapp/node_modules/qs/test/utils.js +136 -0
- gaia/eval/webapp/node_modules/range-parser/HISTORY.md +56 -0
- gaia/eval/webapp/node_modules/range-parser/LICENSE +23 -0
- gaia/eval/webapp/node_modules/range-parser/README.md +84 -0
- gaia/eval/webapp/node_modules/range-parser/index.js +162 -0
- gaia/eval/webapp/node_modules/range-parser/package.json +44 -0
- gaia/eval/webapp/node_modules/raw-body/HISTORY.md +308 -0
- gaia/eval/webapp/node_modules/raw-body/LICENSE +22 -0
- gaia/eval/webapp/node_modules/raw-body/README.md +223 -0
- gaia/eval/webapp/node_modules/raw-body/SECURITY.md +24 -0
- gaia/eval/webapp/node_modules/raw-body/index.d.ts +87 -0
- gaia/eval/webapp/node_modules/raw-body/index.js +336 -0
- gaia/eval/webapp/node_modules/raw-body/package.json +49 -0
- gaia/eval/webapp/node_modules/safe-buffer/LICENSE +21 -0
- gaia/eval/webapp/node_modules/safe-buffer/README.md +584 -0
- gaia/eval/webapp/node_modules/safe-buffer/index.d.ts +187 -0
- gaia/eval/webapp/node_modules/safe-buffer/index.js +65 -0
- gaia/eval/webapp/node_modules/safe-buffer/package.json +51 -0
- gaia/eval/webapp/node_modules/safer-buffer/LICENSE +21 -0
- gaia/eval/webapp/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- gaia/eval/webapp/node_modules/safer-buffer/Readme.md +156 -0
- gaia/eval/webapp/node_modules/safer-buffer/dangerous.js +58 -0
- gaia/eval/webapp/node_modules/safer-buffer/package.json +34 -0
- gaia/eval/webapp/node_modules/safer-buffer/safer.js +77 -0
- gaia/eval/webapp/node_modules/safer-buffer/tests.js +406 -0
- gaia/eval/webapp/node_modules/send/HISTORY.md +526 -0
- gaia/eval/webapp/node_modules/send/LICENSE +23 -0
- gaia/eval/webapp/node_modules/send/README.md +327 -0
- gaia/eval/webapp/node_modules/send/SECURITY.md +24 -0
- gaia/eval/webapp/node_modules/send/index.js +1142 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/HISTORY.md +14 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/README.md +128 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/index.js +60 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/package.json +40 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/index.js +162 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/license.md +21 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/package.json +38 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/readme.md +59 -0
- gaia/eval/webapp/node_modules/send/package.json +62 -0
- gaia/eval/webapp/node_modules/serve-static/HISTORY.md +487 -0
- gaia/eval/webapp/node_modules/serve-static/LICENSE +25 -0
- gaia/eval/webapp/node_modules/serve-static/README.md +257 -0
- gaia/eval/webapp/node_modules/serve-static/index.js +209 -0
- gaia/eval/webapp/node_modules/serve-static/package.json +42 -0
- gaia/eval/webapp/node_modules/setprototypeof/LICENSE +13 -0
- gaia/eval/webapp/node_modules/setprototypeof/README.md +31 -0
- gaia/eval/webapp/node_modules/setprototypeof/index.d.ts +2 -0
- gaia/eval/webapp/node_modules/setprototypeof/index.js +17 -0
- gaia/eval/webapp/node_modules/setprototypeof/package.json +38 -0
- gaia/eval/webapp/node_modules/setprototypeof/test/index.js +24 -0
- gaia/eval/webapp/node_modules/side-channel/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel/.eslintrc +12 -0
- gaia/eval/webapp/node_modules/side-channel/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel/CHANGELOG.md +110 -0
- gaia/eval/webapp/node_modules/side-channel/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel/README.md +61 -0
- gaia/eval/webapp/node_modules/side-channel/index.d.ts +14 -0
- gaia/eval/webapp/node_modules/side-channel/index.js +43 -0
- gaia/eval/webapp/node_modules/side-channel/package.json +85 -0
- gaia/eval/webapp/node_modules/side-channel/test/index.js +104 -0
- gaia/eval/webapp/node_modules/side-channel/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-list/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-list/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-list/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-list/CHANGELOG.md +15 -0
- gaia/eval/webapp/node_modules/side-channel-list/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-list/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-list/index.d.ts +13 -0
- gaia/eval/webapp/node_modules/side-channel-list/index.js +113 -0
- gaia/eval/webapp/node_modules/side-channel-list/list.d.ts +14 -0
- gaia/eval/webapp/node_modules/side-channel-list/package.json +77 -0
- gaia/eval/webapp/node_modules/side-channel-list/test/index.js +104 -0
- gaia/eval/webapp/node_modules/side-channel-list/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-map/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-map/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-map/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-map/CHANGELOG.md +22 -0
- gaia/eval/webapp/node_modules/side-channel-map/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-map/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-map/index.d.ts +15 -0
- gaia/eval/webapp/node_modules/side-channel-map/index.js +68 -0
- gaia/eval/webapp/node_modules/side-channel-map/package.json +80 -0
- gaia/eval/webapp/node_modules/side-channel-map/test/index.js +114 -0
- gaia/eval/webapp/node_modules/side-channel-map/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.eslintrc +12 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/index.d.ts +15 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/index.js +84 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/package.json +87 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/test/index.js +114 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/statuses/HISTORY.md +82 -0
- gaia/eval/webapp/node_modules/statuses/LICENSE +23 -0
- gaia/eval/webapp/node_modules/statuses/README.md +136 -0
- gaia/eval/webapp/node_modules/statuses/codes.json +65 -0
- gaia/eval/webapp/node_modules/statuses/index.js +146 -0
- gaia/eval/webapp/node_modules/statuses/package.json +49 -0
- gaia/eval/webapp/node_modules/toidentifier/HISTORY.md +9 -0
- gaia/eval/webapp/node_modules/toidentifier/LICENSE +21 -0
- gaia/eval/webapp/node_modules/toidentifier/README.md +61 -0
- gaia/eval/webapp/node_modules/toidentifier/index.js +32 -0
- gaia/eval/webapp/node_modules/toidentifier/package.json +38 -0
- gaia/eval/webapp/node_modules/type-is/HISTORY.md +259 -0
- gaia/eval/webapp/node_modules/type-is/LICENSE +23 -0
- gaia/eval/webapp/node_modules/type-is/README.md +170 -0
- gaia/eval/webapp/node_modules/type-is/index.js +266 -0
- gaia/eval/webapp/node_modules/type-is/package.json +45 -0
- gaia/eval/webapp/node_modules/unpipe/HISTORY.md +4 -0
- gaia/eval/webapp/node_modules/unpipe/LICENSE +22 -0
- gaia/eval/webapp/node_modules/unpipe/README.md +43 -0
- gaia/eval/webapp/node_modules/unpipe/index.js +69 -0
- gaia/eval/webapp/node_modules/unpipe/package.json +27 -0
- gaia/eval/webapp/node_modules/util/LICENSE +18 -0
- gaia/eval/webapp/node_modules/util/README.md +15 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/LICENSE +16 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/README.md +42 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits.js +7 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits_browser.js +23 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/package.json +29 -0
- gaia/eval/webapp/node_modules/util/package.json +35 -0
- gaia/eval/webapp/node_modules/util/support/isBuffer.js +3 -0
- gaia/eval/webapp/node_modules/util/support/isBufferBrowser.js +6 -0
- gaia/eval/webapp/node_modules/util/util.js +586 -0
- gaia/eval/webapp/node_modules/utils-merge/.npmignore +9 -0
- gaia/eval/webapp/node_modules/utils-merge/LICENSE +20 -0
- gaia/eval/webapp/node_modules/utils-merge/README.md +34 -0
- gaia/eval/webapp/node_modules/utils-merge/index.js +23 -0
- gaia/eval/webapp/node_modules/utils-merge/package.json +40 -0
- gaia/eval/webapp/node_modules/vary/HISTORY.md +39 -0
- gaia/eval/webapp/node_modules/vary/LICENSE +22 -0
- gaia/eval/webapp/node_modules/vary/README.md +101 -0
- gaia/eval/webapp/node_modules/vary/index.js +149 -0
- gaia/eval/webapp/node_modules/vary/package.json +43 -0
- gaia/eval/webapp/package-lock.json +875 -0
- gaia/eval/webapp/package.json +21 -0
- gaia/eval/webapp/public/app.js +3403 -0
- gaia/eval/webapp/public/index.html +88 -0
- gaia/eval/webapp/public/styles.css +3661 -0
- gaia/eval/webapp/server.js +416 -0
- gaia/eval/webapp/test-setup.js +73 -0
- gaia/llm/__init__.py +2 -0
- gaia/llm/lemonade_client.py +3083 -0
- gaia/llm/lemonade_manager.py +269 -0
- gaia/llm/llm_client.py +729 -0
- gaia/llm/vlm_client.py +307 -0
- gaia/logger.py +189 -0
- gaia/mcp/agent_mcp_server.py +245 -0
- gaia/mcp/blender_mcp_client.py +138 -0
- gaia/mcp/blender_mcp_server.py +648 -0
- gaia/mcp/context7_cache.py +332 -0
- gaia/mcp/external_services.py +518 -0
- gaia/mcp/mcp_bridge.py +550 -0
- gaia/mcp/servers/__init__.py +6 -0
- gaia/mcp/servers/docker_mcp.py +83 -0
- gaia/rag/__init__.py +10 -0
- gaia/rag/app.py +293 -0
- gaia/rag/demo.py +304 -0
- gaia/rag/pdf_utils.py +235 -0
- gaia/rag/sdk.py +2194 -0
- gaia/security.py +163 -0
- gaia/talk/app.py +289 -0
- gaia/talk/sdk.py +538 -0
- gaia/util.py +46 -0
- gaia/version.py +100 -0
gaia/llm/llm_client.py
ADDED
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
# Copyright(C) 2024-2025 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
# Standard library imports
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
import time
|
|
8
|
+
from typing import (
|
|
9
|
+
Any,
|
|
10
|
+
Callable,
|
|
11
|
+
Dict,
|
|
12
|
+
Iterator,
|
|
13
|
+
List,
|
|
14
|
+
Literal,
|
|
15
|
+
Optional,
|
|
16
|
+
TypeVar,
|
|
17
|
+
Union,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
import httpx
|
|
21
|
+
|
|
22
|
+
# Third-party imports
|
|
23
|
+
import requests
|
|
24
|
+
from dotenv import load_dotenv
|
|
25
|
+
from openai import OpenAI
|
|
26
|
+
|
|
27
|
+
from ..version import LEMONADE_VERSION
|
|
28
|
+
|
|
29
|
+
# Local imports
|
|
30
|
+
from .lemonade_client import DEFAULT_MODEL_NAME
|
|
31
|
+
|
|
32
|
+
# Default Lemonade server URL (can be overridden via LEMONADE_BASE_URL env var)
|
|
33
|
+
DEFAULT_LEMONADE_URL = "http://localhost:8000/api/v1"
|
|
34
|
+
|
|
35
|
+
# Type variable for retry decorator
|
|
36
|
+
T = TypeVar("T")
|
|
37
|
+
|
|
38
|
+
# Conditional import for Claude
|
|
39
|
+
try:
|
|
40
|
+
from ..eval.claude import ClaudeClient as AnthropicClaudeClient
|
|
41
|
+
|
|
42
|
+
CLAUDE_AVAILABLE = True
|
|
43
|
+
except ImportError:
|
|
44
|
+
CLAUDE_AVAILABLE = False
|
|
45
|
+
|
|
46
|
+
# Set up logging
|
|
47
|
+
logging.basicConfig(level=logging.INFO)
|
|
48
|
+
logger = logging.getLogger(__name__)
|
|
49
|
+
logger.setLevel(logging.INFO) # Explicitly set module logger level
|
|
50
|
+
|
|
51
|
+
# Load environment variables from .env file
|
|
52
|
+
load_dotenv()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class LLMClient:
|
|
56
|
+
def __init__(
|
|
57
|
+
self,
|
|
58
|
+
use_claude: bool = False,
|
|
59
|
+
use_openai: bool = False,
|
|
60
|
+
system_prompt: Optional[str] = None,
|
|
61
|
+
base_url: Optional[str] = None,
|
|
62
|
+
claude_model: str = "claude-sonnet-4-20250514",
|
|
63
|
+
max_retries: int = 3,
|
|
64
|
+
retry_base_delay: float = 1.0,
|
|
65
|
+
):
|
|
66
|
+
"""
|
|
67
|
+
Initialize the LLM client.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
use_claude: If True, uses Anthropic Claude API.
|
|
71
|
+
use_openai: If True, uses OpenAI ChatGPT API.
|
|
72
|
+
system_prompt: Default system prompt to use for all generation requests.
|
|
73
|
+
base_url: Base URL for local LLM server (defaults to LEMONADE_BASE_URL env var).
|
|
74
|
+
claude_model: Claude model to use (e.g., "claude-sonnet-4-20250514").
|
|
75
|
+
max_retries: Maximum number of retry attempts on connection errors.
|
|
76
|
+
retry_base_delay: Base delay in seconds for exponential backoff.
|
|
77
|
+
|
|
78
|
+
Note: Uses local LLM server by default unless use_claude or use_openai is True.
|
|
79
|
+
Context size is configured when starting the Lemonade server with --ctx-size parameter.
|
|
80
|
+
"""
|
|
81
|
+
# Use provided base_url, fall back to env var, then default
|
|
82
|
+
if base_url is None:
|
|
83
|
+
base_url = os.getenv("LEMONADE_BASE_URL", DEFAULT_LEMONADE_URL)
|
|
84
|
+
|
|
85
|
+
# Normalize base_url to ensure it has the /api/v1 suffix for Lemonade server
|
|
86
|
+
# This allows users to specify just "http://localhost:8000" for convenience
|
|
87
|
+
if base_url and not base_url.endswith("/api/v1"):
|
|
88
|
+
# Remove trailing slash if present
|
|
89
|
+
base_url = base_url.rstrip("/")
|
|
90
|
+
# Add /api/v1 if the URL looks like a Lemonade server (localhost or IP with port)
|
|
91
|
+
# but doesn't already have a path beyond the port
|
|
92
|
+
from urllib.parse import urlparse
|
|
93
|
+
|
|
94
|
+
parsed = urlparse(base_url)
|
|
95
|
+
# Only add /api/v1 if path is empty or just "/"
|
|
96
|
+
if not parsed.path or parsed.path == "/":
|
|
97
|
+
base_url = f"{base_url}/api/v1"
|
|
98
|
+
logger.debug(f"Normalized base_url to: {base_url}")
|
|
99
|
+
|
|
100
|
+
# Compute use_local: True if neither claude nor openai is selected
|
|
101
|
+
use_local = not (use_claude or use_openai)
|
|
102
|
+
|
|
103
|
+
logger.debug(
|
|
104
|
+
f"Initializing LLMClient with use_local={use_local}, use_claude={use_claude}, use_openai={use_openai}, base_url={base_url}"
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
self.use_claude = use_claude
|
|
108
|
+
self.use_openai = use_openai
|
|
109
|
+
self.base_url = base_url
|
|
110
|
+
self.system_prompt = system_prompt
|
|
111
|
+
self.max_retries = max_retries
|
|
112
|
+
self.retry_base_delay = retry_base_delay
|
|
113
|
+
|
|
114
|
+
if use_local:
|
|
115
|
+
# Configure timeout for local LLM server
|
|
116
|
+
# For streaming: timeout between chunks (read timeout)
|
|
117
|
+
# For non-streaming: total timeout for the entire response
|
|
118
|
+
self.client = OpenAI(
|
|
119
|
+
base_url=base_url,
|
|
120
|
+
api_key="None",
|
|
121
|
+
timeout=httpx.Timeout(
|
|
122
|
+
connect=15.0, # 15 seconds to establish connection
|
|
123
|
+
read=120.0, # 120 seconds between data chunks (matches Lemonade DEFAULT_REQUEST_TIMEOUT)
|
|
124
|
+
write=15.0, # 15 seconds to send request
|
|
125
|
+
pool=15.0, # 15 seconds to acquire connection from pool
|
|
126
|
+
),
|
|
127
|
+
max_retries=0, # Disable retries to fail fast on connection issues
|
|
128
|
+
)
|
|
129
|
+
# Use completions endpoint for pre-formatted prompts (ChatSDK compatibility)
|
|
130
|
+
# Use chat endpoint when messages array is explicitly provided
|
|
131
|
+
self.endpoint = "completions"
|
|
132
|
+
logger.debug("Using Lemonade completions endpoint")
|
|
133
|
+
self.default_model = DEFAULT_MODEL_NAME
|
|
134
|
+
self.claude_client = None
|
|
135
|
+
logger.debug(f"Using local LLM with model={self.default_model}")
|
|
136
|
+
elif use_claude and CLAUDE_AVAILABLE:
|
|
137
|
+
# Use Claude API
|
|
138
|
+
self.claude_client = AnthropicClaudeClient(model=claude_model)
|
|
139
|
+
self.client = None
|
|
140
|
+
self.endpoint = "claude"
|
|
141
|
+
self.default_model = claude_model
|
|
142
|
+
logger.debug(f"Using Claude API with model={self.default_model}")
|
|
143
|
+
elif use_claude and not CLAUDE_AVAILABLE:
|
|
144
|
+
raise ValueError(
|
|
145
|
+
"Claude support requested but anthropic library not available. Install with: pip install anthropic"
|
|
146
|
+
)
|
|
147
|
+
elif use_openai:
|
|
148
|
+
# Use OpenAI API
|
|
149
|
+
api_key = os.getenv("OPENAI_API_KEY")
|
|
150
|
+
if not api_key:
|
|
151
|
+
raise ValueError(
|
|
152
|
+
"OPENAI_API_KEY not found in environment variables. Please add it to your .env file."
|
|
153
|
+
)
|
|
154
|
+
self.client = OpenAI(api_key=api_key)
|
|
155
|
+
self.claude_client = None
|
|
156
|
+
self.endpoint = "openai"
|
|
157
|
+
self.default_model = "gpt-4o" # Updated to latest model
|
|
158
|
+
logger.debug(f"Using OpenAI API with model={self.default_model}")
|
|
159
|
+
else:
|
|
160
|
+
# This should not happen with the new logic, but keep as fallback
|
|
161
|
+
raise ValueError("Invalid LLM provider configuration")
|
|
162
|
+
if system_prompt:
|
|
163
|
+
logger.debug(f"System prompt set: {system_prompt[:100]}...")
|
|
164
|
+
|
|
165
|
+
def _retry_with_exponential_backoff(
|
|
166
|
+
self,
|
|
167
|
+
func: Callable[..., T],
|
|
168
|
+
*args,
|
|
169
|
+
**kwargs,
|
|
170
|
+
) -> T:
|
|
171
|
+
"""
|
|
172
|
+
Execute a function with exponential backoff retry on connection errors.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
func: The function to execute
|
|
176
|
+
*args: Positional arguments for the function
|
|
177
|
+
**kwargs: Keyword arguments for the function
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
The result of the function call
|
|
181
|
+
|
|
182
|
+
Raises:
|
|
183
|
+
The last exception if all retries are exhausted
|
|
184
|
+
"""
|
|
185
|
+
delay = self.retry_base_delay
|
|
186
|
+
max_delay = 60.0
|
|
187
|
+
exponential_base = 2.0
|
|
188
|
+
|
|
189
|
+
for attempt in range(self.max_retries + 1):
|
|
190
|
+
try:
|
|
191
|
+
return func(*args, **kwargs)
|
|
192
|
+
except (
|
|
193
|
+
ConnectionError,
|
|
194
|
+
httpx.ConnectError,
|
|
195
|
+
httpx.TimeoutException,
|
|
196
|
+
httpx.NetworkError,
|
|
197
|
+
requests.exceptions.ConnectionError,
|
|
198
|
+
requests.exceptions.Timeout,
|
|
199
|
+
) as e:
|
|
200
|
+
if attempt == self.max_retries:
|
|
201
|
+
logger.error(
|
|
202
|
+
f"Max retries ({self.max_retries}) reached for {func.__name__}. "
|
|
203
|
+
f"Last error: {str(e)}"
|
|
204
|
+
)
|
|
205
|
+
raise
|
|
206
|
+
|
|
207
|
+
# Calculate next delay with exponential backoff
|
|
208
|
+
wait_time = min(delay, max_delay)
|
|
209
|
+
logger.warning(
|
|
210
|
+
f"Connection error in {func.__name__} (attempt {attempt + 1}/{self.max_retries + 1}): {str(e)}. "
|
|
211
|
+
f"Retrying in {wait_time:.1f}s..."
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
time.sleep(wait_time)
|
|
215
|
+
delay *= exponential_base
|
|
216
|
+
|
|
217
|
+
def generate(
|
|
218
|
+
self,
|
|
219
|
+
prompt: str,
|
|
220
|
+
model: Optional[str] = None,
|
|
221
|
+
endpoint: Optional[Literal["completions", "chat", "claude", "openai"]] = None,
|
|
222
|
+
system_prompt: Optional[str] = None,
|
|
223
|
+
stream: bool = False,
|
|
224
|
+
messages: Optional[List[Dict[str, str]]] = None,
|
|
225
|
+
**kwargs: Any,
|
|
226
|
+
) -> Union[str, Iterator[str]]:
|
|
227
|
+
"""
|
|
228
|
+
Generate a response from the LLM.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
prompt: The user prompt/query to send to the LLM. For chat endpoint,
|
|
232
|
+
if messages is not provided, this is treated as a pre-formatted
|
|
233
|
+
prompt string that already contains the full conversation.
|
|
234
|
+
model: The model to use (defaults to endpoint-appropriate model)
|
|
235
|
+
endpoint: Override the endpoint to use (completions, chat, claude, or openai)
|
|
236
|
+
system_prompt: System prompt to use for this specific request (overrides default)
|
|
237
|
+
stream: If True, returns a generator that yields chunks of the response as they become available
|
|
238
|
+
messages: Optional list of message dicts with 'role' and 'content' keys.
|
|
239
|
+
If provided, these are used directly for chat completions instead of prompt.
|
|
240
|
+
**kwargs: Additional parameters to pass to the API
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
If stream=False: The complete generated text as a string
|
|
244
|
+
If stream=True: A generator yielding chunks of the response as they become available
|
|
245
|
+
"""
|
|
246
|
+
model = model or self.default_model
|
|
247
|
+
endpoint_to_use = endpoint or self.endpoint
|
|
248
|
+
logger.debug(
|
|
249
|
+
f"LLMClient.generate() called with model={model}, endpoint={endpoint_to_use}, stream={stream}"
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
# Use provided system_prompt, fall back to instance default if not provided
|
|
253
|
+
effective_system_prompt = (
|
|
254
|
+
system_prompt if system_prompt is not None else self.system_prompt
|
|
255
|
+
)
|
|
256
|
+
logger.debug(
|
|
257
|
+
f"Using system prompt: {effective_system_prompt[:100] if effective_system_prompt else 'None'}..."
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
if endpoint_to_use == "claude":
|
|
261
|
+
# For Claude API, construct the prompt appropriately
|
|
262
|
+
if effective_system_prompt:
|
|
263
|
+
# Claude handles system prompts differently in messages format
|
|
264
|
+
full_prompt = f"System: {effective_system_prompt}\n\nHuman: {prompt}"
|
|
265
|
+
else:
|
|
266
|
+
full_prompt = prompt
|
|
267
|
+
|
|
268
|
+
logger.debug(f"Using Claude API with prompt: {full_prompt[:200]}...")
|
|
269
|
+
|
|
270
|
+
try:
|
|
271
|
+
if stream:
|
|
272
|
+
logger.warning(
|
|
273
|
+
"Streaming not yet implemented for Claude API, falling back to non-streaming"
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
# Use Claude client with retry logic
|
|
277
|
+
logger.debug("Making request to Claude API")
|
|
278
|
+
|
|
279
|
+
# Use retry logic for the API call
|
|
280
|
+
result = self._retry_with_exponential_backoff(
|
|
281
|
+
self.claude_client.get_completion, full_prompt
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Claude returns a list of content blocks, extract text
|
|
285
|
+
if isinstance(result, list) and len(result) > 0:
|
|
286
|
+
# Each content block has a 'text' attribute
|
|
287
|
+
text_parts = []
|
|
288
|
+
for content_block in result:
|
|
289
|
+
if hasattr(content_block, "text"):
|
|
290
|
+
text_parts.append(content_block.text)
|
|
291
|
+
else:
|
|
292
|
+
text_parts.append(str(content_block))
|
|
293
|
+
result = "".join(text_parts)
|
|
294
|
+
elif isinstance(result, str):
|
|
295
|
+
pass # result is already a string
|
|
296
|
+
else:
|
|
297
|
+
result = str(result)
|
|
298
|
+
|
|
299
|
+
# Check for empty responses
|
|
300
|
+
if not result or not result.strip():
|
|
301
|
+
logger.warning("Empty response from Claude API")
|
|
302
|
+
|
|
303
|
+
# Debug: log the response structure for troubleshooting
|
|
304
|
+
logger.debug(f"Claude response length: {len(result)}")
|
|
305
|
+
logger.debug(f"Claude response preview: {result[:300]}...")
|
|
306
|
+
|
|
307
|
+
# Claude sometimes returns valid JSON followed by additional text
|
|
308
|
+
# Try to extract just the JSON part if it exists
|
|
309
|
+
result = self._clean_claude_response(result)
|
|
310
|
+
|
|
311
|
+
return result
|
|
312
|
+
except Exception as e:
|
|
313
|
+
logger.error(f"Error generating response from Claude API: {str(e)}")
|
|
314
|
+
raise
|
|
315
|
+
elif endpoint_to_use == "completions":
|
|
316
|
+
# For local LLM with pre-formatted prompts (ChatSDK uses this)
|
|
317
|
+
# The prompt already contains the full formatted conversation
|
|
318
|
+
logger.debug(
|
|
319
|
+
f"Using completions endpoint: prompt_length={len(prompt)} chars"
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
try:
|
|
323
|
+
# Use retry logic for the API call
|
|
324
|
+
response = self._retry_with_exponential_backoff(
|
|
325
|
+
self.client.completions.create,
|
|
326
|
+
model=model,
|
|
327
|
+
prompt=prompt,
|
|
328
|
+
temperature=0.1,
|
|
329
|
+
stream=stream,
|
|
330
|
+
**kwargs,
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
if stream:
|
|
334
|
+
# Return a generator that yields chunks
|
|
335
|
+
def stream_generator():
|
|
336
|
+
for chunk in response:
|
|
337
|
+
if (
|
|
338
|
+
hasattr(chunk.choices[0], "text")
|
|
339
|
+
and chunk.choices[0].text
|
|
340
|
+
):
|
|
341
|
+
yield chunk.choices[0].text
|
|
342
|
+
|
|
343
|
+
return stream_generator()
|
|
344
|
+
else:
|
|
345
|
+
# Return the complete response
|
|
346
|
+
result = response.choices[0].text
|
|
347
|
+
if not result or not result.strip():
|
|
348
|
+
logger.warning("Empty response from local LLM")
|
|
349
|
+
return result
|
|
350
|
+
except (
|
|
351
|
+
httpx.ConnectError,
|
|
352
|
+
httpx.TimeoutException,
|
|
353
|
+
httpx.NetworkError,
|
|
354
|
+
) as e:
|
|
355
|
+
logger.error(f"Network error connecting to local LLM server: {str(e)}")
|
|
356
|
+
error_msg = f"LLM Server Connection Error: {str(e)}"
|
|
357
|
+
raise ConnectionError(error_msg) from e
|
|
358
|
+
except Exception as e:
|
|
359
|
+
error_str = str(e)
|
|
360
|
+
logger.error(f"Error generating response from local LLM: {error_str}")
|
|
361
|
+
|
|
362
|
+
if "404" in error_str:
|
|
363
|
+
if (
|
|
364
|
+
"endpoint" in error_str.lower()
|
|
365
|
+
or "not found" in error_str.lower()
|
|
366
|
+
):
|
|
367
|
+
raise ConnectionError(
|
|
368
|
+
f"API endpoint error: {error_str}\n\n"
|
|
369
|
+
f"This may indicate:\n"
|
|
370
|
+
f" 1. Lemonade Server version mismatch (try updating to {LEMONADE_VERSION})\n"
|
|
371
|
+
f" 2. Model not properly loaded or corrupted\n\n"
|
|
372
|
+
f"To fix model issues, try:\n"
|
|
373
|
+
f" lemonade model remove <model-name>\n"
|
|
374
|
+
f" lemonade model download <model-name>\n"
|
|
375
|
+
) from e
|
|
376
|
+
|
|
377
|
+
if "network" in error_str.lower() or "connection" in error_str.lower():
|
|
378
|
+
raise ConnectionError(f"LLM Server Error: {error_str}") from e
|
|
379
|
+
raise
|
|
380
|
+
elif endpoint_to_use == "chat":
|
|
381
|
+
# For local LLM using chat completions format (Lemonade v9+)
|
|
382
|
+
if messages:
|
|
383
|
+
# Use provided messages directly (proper chat history support)
|
|
384
|
+
chat_messages = list(messages)
|
|
385
|
+
# Prepend system prompt if provided and not already in messages
|
|
386
|
+
if effective_system_prompt and (
|
|
387
|
+
not chat_messages or chat_messages[0].get("role") != "system"
|
|
388
|
+
):
|
|
389
|
+
chat_messages.insert(
|
|
390
|
+
0, {"role": "system", "content": effective_system_prompt}
|
|
391
|
+
)
|
|
392
|
+
else:
|
|
393
|
+
# Treat prompt as pre-formatted string (legacy ChatSDK support)
|
|
394
|
+
# Pass as single user message - the prompt already contains formatted history
|
|
395
|
+
chat_messages = []
|
|
396
|
+
if effective_system_prompt:
|
|
397
|
+
chat_messages.append(
|
|
398
|
+
{"role": "system", "content": effective_system_prompt}
|
|
399
|
+
)
|
|
400
|
+
chat_messages.append({"role": "user", "content": prompt})
|
|
401
|
+
logger.debug(
|
|
402
|
+
f"Using chat completions for local LLM: {len(chat_messages)} messages"
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
try:
|
|
406
|
+
# Use retry logic for the API call
|
|
407
|
+
response = self._retry_with_exponential_backoff(
|
|
408
|
+
self.client.chat.completions.create,
|
|
409
|
+
model=model,
|
|
410
|
+
messages=chat_messages,
|
|
411
|
+
temperature=0.1,
|
|
412
|
+
stream=stream,
|
|
413
|
+
**kwargs,
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
if stream:
|
|
417
|
+
# Return a generator that yields chunks
|
|
418
|
+
def stream_generator():
|
|
419
|
+
for chunk in response:
|
|
420
|
+
if (
|
|
421
|
+
hasattr(chunk.choices[0].delta, "content")
|
|
422
|
+
and chunk.choices[0].delta.content
|
|
423
|
+
):
|
|
424
|
+
yield chunk.choices[0].delta.content
|
|
425
|
+
|
|
426
|
+
return stream_generator()
|
|
427
|
+
else:
|
|
428
|
+
# Return the complete response
|
|
429
|
+
result = response.choices[0].message.content
|
|
430
|
+
if not result or not result.strip():
|
|
431
|
+
logger.warning("Empty response from local LLM")
|
|
432
|
+
return result
|
|
433
|
+
except (
|
|
434
|
+
httpx.ConnectError,
|
|
435
|
+
httpx.TimeoutException,
|
|
436
|
+
httpx.NetworkError,
|
|
437
|
+
) as e:
|
|
438
|
+
logger.error(f"Network error connecting to local LLM server: {str(e)}")
|
|
439
|
+
error_msg = f"LLM Server Connection Error: {str(e)}"
|
|
440
|
+
raise ConnectionError(error_msg) from e
|
|
441
|
+
except Exception as e:
|
|
442
|
+
error_str = str(e)
|
|
443
|
+
logger.error(f"Error generating response from local LLM: {error_str}")
|
|
444
|
+
|
|
445
|
+
# Check for 404 errors which might indicate endpoint or model issues
|
|
446
|
+
if "404" in error_str:
|
|
447
|
+
if (
|
|
448
|
+
"endpoint" in error_str.lower()
|
|
449
|
+
or "not found" in error_str.lower()
|
|
450
|
+
):
|
|
451
|
+
raise ConnectionError(
|
|
452
|
+
f"API endpoint error: {error_str}\n\n"
|
|
453
|
+
f"This may indicate:\n"
|
|
454
|
+
f" 1. Lemonade Server version mismatch (try updating to {LEMONADE_VERSION})\n"
|
|
455
|
+
f" 2. Model not properly loaded or corrupted\n\n"
|
|
456
|
+
f"To fix model issues, try:\n"
|
|
457
|
+
f" lemonade model remove <model-name>\n"
|
|
458
|
+
f" lemonade model download <model-name>\n"
|
|
459
|
+
) from e
|
|
460
|
+
|
|
461
|
+
if "network" in error_str.lower() or "connection" in error_str.lower():
|
|
462
|
+
raise ConnectionError(f"LLM Server Error: {error_str}") from e
|
|
463
|
+
raise
|
|
464
|
+
elif endpoint_to_use == "openai":
|
|
465
|
+
# For OpenAI API, use the messages format
|
|
466
|
+
messages = []
|
|
467
|
+
if effective_system_prompt:
|
|
468
|
+
messages.append({"role": "system", "content": effective_system_prompt})
|
|
469
|
+
messages.append({"role": "user", "content": prompt})
|
|
470
|
+
logger.debug(f"OpenAI API messages: {messages}")
|
|
471
|
+
|
|
472
|
+
try:
|
|
473
|
+
# Use retry logic for the API call
|
|
474
|
+
response = self._retry_with_exponential_backoff(
|
|
475
|
+
self.client.chat.completions.create,
|
|
476
|
+
model=model,
|
|
477
|
+
messages=messages,
|
|
478
|
+
stream=stream,
|
|
479
|
+
**kwargs,
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
if stream:
|
|
483
|
+
# Return a generator that yields chunks
|
|
484
|
+
def stream_generator():
|
|
485
|
+
for chunk in response:
|
|
486
|
+
if (
|
|
487
|
+
hasattr(chunk.choices[0].delta, "content")
|
|
488
|
+
and chunk.choices[0].delta.content
|
|
489
|
+
):
|
|
490
|
+
yield chunk.choices[0].delta.content
|
|
491
|
+
|
|
492
|
+
return stream_generator()
|
|
493
|
+
else:
|
|
494
|
+
# Return the complete response as before
|
|
495
|
+
result = response.choices[0].message.content
|
|
496
|
+
logger.debug(f"OpenAI API response: {result[:200]}...")
|
|
497
|
+
return result
|
|
498
|
+
except Exception as e:
|
|
499
|
+
logger.error(f"Error generating response from OpenAI API: {str(e)}")
|
|
500
|
+
raise
|
|
501
|
+
else:
|
|
502
|
+
raise ValueError(
|
|
503
|
+
f"Unsupported endpoint: {endpoint_to_use}. Supported endpoints: 'completions', 'chat', 'claude', 'openai'."
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
def get_performance_stats(self) -> Dict[str, Any]:
|
|
507
|
+
"""
|
|
508
|
+
Get performance statistics from the last LLM request.
|
|
509
|
+
|
|
510
|
+
Returns:
|
|
511
|
+
Dictionary containing performance statistics like:
|
|
512
|
+
- time_to_first_token: Time in seconds until first token is generated
|
|
513
|
+
- tokens_per_second: Rate of token generation
|
|
514
|
+
- input_tokens: Number of tokens in the input
|
|
515
|
+
- output_tokens: Number of tokens in the output
|
|
516
|
+
"""
|
|
517
|
+
if not self.base_url:
|
|
518
|
+
# Return empty stats if not using local LLM
|
|
519
|
+
return {
|
|
520
|
+
"time_to_first_token": None,
|
|
521
|
+
"tokens_per_second": None,
|
|
522
|
+
"input_tokens": None,
|
|
523
|
+
"output_tokens": None,
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
try:
|
|
527
|
+
# Use the Lemonade API v1 stats endpoint
|
|
528
|
+
# This returns both timing stats and token counts
|
|
529
|
+
stats_url = f"{self.base_url}/stats"
|
|
530
|
+
response = requests.get(stats_url)
|
|
531
|
+
|
|
532
|
+
if response.status_code == 200:
|
|
533
|
+
stats = response.json()
|
|
534
|
+
# Remove decode_token_times as it's too verbose
|
|
535
|
+
if "decode_token_times" in stats:
|
|
536
|
+
del stats["decode_token_times"]
|
|
537
|
+
return stats
|
|
538
|
+
else:
|
|
539
|
+
logger.warning(
|
|
540
|
+
f"Failed to get stats: {response.status_code} - {response.text}"
|
|
541
|
+
)
|
|
542
|
+
return {}
|
|
543
|
+
except Exception as e:
|
|
544
|
+
logger.warning(f"Error fetching performance stats: {str(e)}")
|
|
545
|
+
return {}
|
|
546
|
+
|
|
547
|
+
def is_generating(self) -> bool:
|
|
548
|
+
"""
|
|
549
|
+
Check if the local LLM is currently generating.
|
|
550
|
+
|
|
551
|
+
Returns:
|
|
552
|
+
bool: True if generating, False otherwise
|
|
553
|
+
|
|
554
|
+
Note:
|
|
555
|
+
Only available when using local LLM (use_local=True).
|
|
556
|
+
Returns False for OpenAI API usage.
|
|
557
|
+
"""
|
|
558
|
+
if not self.base_url:
|
|
559
|
+
logger.debug("is_generating(): Not using local LLM, returning False")
|
|
560
|
+
return False
|
|
561
|
+
|
|
562
|
+
try:
|
|
563
|
+
# Check the generating endpoint
|
|
564
|
+
# Remove /api/v1 suffix to access root-level endpoints
|
|
565
|
+
base = self.base_url.replace("/api/v1", "")
|
|
566
|
+
generating_url = f"{base}/generating"
|
|
567
|
+
response = requests.get(generating_url)
|
|
568
|
+
if response.status_code == 200:
|
|
569
|
+
response_data = response.json()
|
|
570
|
+
is_gen = response_data.get("is_generating", False)
|
|
571
|
+
logger.debug(f"Generation status check: {is_gen}")
|
|
572
|
+
return is_gen
|
|
573
|
+
else:
|
|
574
|
+
logger.warning(
|
|
575
|
+
f"Failed to check generation status: {response.status_code} - {response.text}"
|
|
576
|
+
)
|
|
577
|
+
return False
|
|
578
|
+
except Exception as e:
|
|
579
|
+
logger.warning(f"Error checking generation status: {str(e)}")
|
|
580
|
+
return False
|
|
581
|
+
|
|
582
|
+
def halt_generation(self) -> bool:
|
|
583
|
+
"""
|
|
584
|
+
Halt current generation on the local LLM server.
|
|
585
|
+
|
|
586
|
+
Returns:
|
|
587
|
+
bool: True if halt was successful, False otherwise
|
|
588
|
+
|
|
589
|
+
Note:
|
|
590
|
+
Only available when using local LLM (use_local=True).
|
|
591
|
+
Does nothing for OpenAI API usage.
|
|
592
|
+
"""
|
|
593
|
+
if not self.base_url:
|
|
594
|
+
logger.debug("halt_generation(): Not using local LLM, nothing to halt")
|
|
595
|
+
return False
|
|
596
|
+
|
|
597
|
+
try:
|
|
598
|
+
# Send halt request
|
|
599
|
+
# Remove /api/v1 suffix to access root-level endpoints
|
|
600
|
+
base = self.base_url.replace("/api/v1", "")
|
|
601
|
+
halt_url = f"{base}/halt"
|
|
602
|
+
response = requests.get(halt_url)
|
|
603
|
+
if response.status_code == 200:
|
|
604
|
+
logger.debug("Successfully halted current generation")
|
|
605
|
+
return True
|
|
606
|
+
else:
|
|
607
|
+
logger.warning(
|
|
608
|
+
f"Failed to halt generation: {response.status_code} - {response.text}"
|
|
609
|
+
)
|
|
610
|
+
return False
|
|
611
|
+
except Exception as e:
|
|
612
|
+
logger.warning(f"Error halting generation: {str(e)}")
|
|
613
|
+
return False
|
|
614
|
+
|
|
615
|
+
def _clean_claude_response(self, response: str) -> str:
|
|
616
|
+
"""
|
|
617
|
+
Extract valid JSON from Claude responses that may contain extra content after the JSON.
|
|
618
|
+
|
|
619
|
+
Args:
|
|
620
|
+
response: The raw response from Claude API
|
|
621
|
+
|
|
622
|
+
Returns:
|
|
623
|
+
Cleaned response with only the JSON portion
|
|
624
|
+
"""
|
|
625
|
+
import json
|
|
626
|
+
|
|
627
|
+
if not response or not response.strip():
|
|
628
|
+
return response
|
|
629
|
+
|
|
630
|
+
# Try to parse as-is first
|
|
631
|
+
try:
|
|
632
|
+
json.loads(response.strip())
|
|
633
|
+
return response.strip()
|
|
634
|
+
except json.JSONDecodeError:
|
|
635
|
+
pass
|
|
636
|
+
|
|
637
|
+
# Look for JSON object patterns
|
|
638
|
+
# Find the first { and try to extract a complete JSON object
|
|
639
|
+
start_idx = response.find("{")
|
|
640
|
+
if start_idx == -1:
|
|
641
|
+
# No JSON object found, return as-is
|
|
642
|
+
return response
|
|
643
|
+
|
|
644
|
+
# Find the matching closing brace by counting braces
|
|
645
|
+
brace_count = 0
|
|
646
|
+
end_idx = -1
|
|
647
|
+
|
|
648
|
+
for i in range(start_idx, len(response)):
|
|
649
|
+
char = response[i]
|
|
650
|
+
if char == "{":
|
|
651
|
+
brace_count += 1
|
|
652
|
+
elif char == "}":
|
|
653
|
+
brace_count -= 1
|
|
654
|
+
if brace_count == 0:
|
|
655
|
+
end_idx = i
|
|
656
|
+
break
|
|
657
|
+
|
|
658
|
+
if end_idx == -1:
|
|
659
|
+
# No complete JSON object found
|
|
660
|
+
return response
|
|
661
|
+
|
|
662
|
+
# Extract the JSON portion
|
|
663
|
+
json_portion = response[start_idx : end_idx + 1]
|
|
664
|
+
|
|
665
|
+
# Validate that it's valid JSON
|
|
666
|
+
try:
|
|
667
|
+
json.loads(json_portion)
|
|
668
|
+
logger.debug(
|
|
669
|
+
f"Extracted JSON from Claude response: {len(json_portion)} chars vs original {len(response)} chars"
|
|
670
|
+
)
|
|
671
|
+
return json_portion
|
|
672
|
+
except json.JSONDecodeError:
|
|
673
|
+
# If extracted portion is not valid JSON, return original
|
|
674
|
+
logger.debug(
|
|
675
|
+
"Could not extract valid JSON from Claude response, returning original"
|
|
676
|
+
)
|
|
677
|
+
return response
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
def main():
|
|
681
|
+
# Example usage with local LLM
|
|
682
|
+
system_prompt = "You are a creative assistant who specializes in short stories."
|
|
683
|
+
|
|
684
|
+
local_llm = LLMClient(system_prompt=system_prompt)
|
|
685
|
+
|
|
686
|
+
# Non-streaming example
|
|
687
|
+
result = local_llm.generate("Write a one-sentence bedtime story about a unicorn.")
|
|
688
|
+
print(f"Local LLM response:\n{result}")
|
|
689
|
+
print(f"Local LLM stats:\n{local_llm.get_performance_stats()}")
|
|
690
|
+
|
|
691
|
+
# Halt functionality demo (only for local LLM)
|
|
692
|
+
print(f"\nHalt functionality available: {local_llm.is_generating()}")
|
|
693
|
+
|
|
694
|
+
# Streaming example
|
|
695
|
+
print("\nLocal LLM streaming response:")
|
|
696
|
+
for chunk in local_llm.generate(
|
|
697
|
+
"Write a one-sentence bedtime story about a dragon.", stream=True
|
|
698
|
+
):
|
|
699
|
+
print(chunk, end="", flush=True)
|
|
700
|
+
print("\n")
|
|
701
|
+
|
|
702
|
+
# Example usage with Claude API
|
|
703
|
+
if CLAUDE_AVAILABLE:
|
|
704
|
+
claude_llm = LLMClient(use_claude=True, system_prompt=system_prompt)
|
|
705
|
+
|
|
706
|
+
# Non-streaming example
|
|
707
|
+
result = claude_llm.generate(
|
|
708
|
+
"Write a one-sentence bedtime story about a unicorn."
|
|
709
|
+
)
|
|
710
|
+
print(f"\nClaude API response:\n{result}")
|
|
711
|
+
|
|
712
|
+
# Example usage with OpenAI API
|
|
713
|
+
openai_llm = LLMClient(use_openai=True, system_prompt=system_prompt)
|
|
714
|
+
|
|
715
|
+
# Non-streaming example
|
|
716
|
+
result = openai_llm.generate("Write a one-sentence bedtime story about a unicorn.")
|
|
717
|
+
print(f"\nOpenAI API response:\n{result}")
|
|
718
|
+
|
|
719
|
+
# Streaming example
|
|
720
|
+
print("\nOpenAI API streaming response:")
|
|
721
|
+
for chunk in openai_llm.generate(
|
|
722
|
+
"Write a one-sentence bedtime story about a dragon.", stream=True
|
|
723
|
+
):
|
|
724
|
+
print(chunk, end="", flush=True)
|
|
725
|
+
print("\n")
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
if __name__ == "__main__":
|
|
729
|
+
main()
|