diff --git a/._.git b/._.git new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._.git differ diff --git a/._.github b/._.github new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._.github differ diff --git a/._.gitignore b/._.gitignore new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._.gitignore differ diff --git a/._.readthedocs.yaml b/._.readthedocs.yaml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._.readthedocs.yaml differ diff --git a/._.venv b/._.venv new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._.venv differ diff --git a/._AGENTS.md b/._AGENTS.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._AGENTS.md differ diff --git a/._Justfile b/._Justfile new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._Justfile differ diff --git a/._LICENSE b/._LICENSE new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._LICENSE differ diff --git a/._MANIFEST.in b/._MANIFEST.in new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._MANIFEST.in differ diff --git a/._README.md b/._README.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._README.md differ diff --git a/._docs b/._docs new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._docs differ diff --git a/._llm b/._llm new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._llm differ diff --git a/._mypy.ini b/._mypy.ini new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._mypy.ini differ diff --git a/._pyproject.toml b/._pyproject.toml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._pyproject.toml differ diff --git a/._pytest.ini b/._pytest.ini new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._pytest.ini differ diff --git a/._ruff.toml b/._ruff.toml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._ruff.toml differ diff --git a/._tests b/._tests new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/._tests differ diff --git a/.github/._FUNDING.yml b/.github/._FUNDING.yml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/.github/._FUNDING.yml differ diff --git a/.github/._dependabot.yml b/.github/._dependabot.yml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/.github/._dependabot.yml differ diff --git a/.github/._workflows b/.github/._workflows new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/.github/._workflows differ diff --git a/.github/workflows/._cog.yml b/.github/workflows/._cog.yml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/.github/workflows/._cog.yml differ diff --git a/.github/workflows/._publish.yml b/.github/workflows/._publish.yml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/.github/workflows/._publish.yml differ diff --git a/.github/workflows/._stable-docs.yml b/.github/workflows/._stable-docs.yml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/.github/workflows/._stable-docs.yml differ diff --git a/.github/workflows/._test.yml b/.github/workflows/._test.yml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/.github/workflows/._test.yml differ diff --git a/docs/._.gitignore b/docs/._.gitignore new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._.gitignore differ diff --git a/docs/._Makefile b/docs/._Makefile new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._Makefile differ diff --git a/docs/.__templates b/docs/.__templates new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/.__templates differ diff --git a/docs/._aliases.md b/docs/._aliases.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._aliases.md differ diff --git a/docs/._changelog.md b/docs/._changelog.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._changelog.md differ diff --git a/docs/._conf.py b/docs/._conf.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._conf.py differ diff --git a/docs/._contributing.md b/docs/._contributing.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._contributing.md differ diff --git a/docs/._embeddings b/docs/._embeddings new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._embeddings differ diff --git a/docs/._fragments.md b/docs/._fragments.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._fragments.md differ diff --git a/docs/._help.md b/docs/._help.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._help.md differ diff --git a/docs/._index.md b/docs/._index.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._index.md differ diff --git a/docs/._logging.md b/docs/._logging.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._logging.md differ diff --git a/docs/._openai-models.md b/docs/._openai-models.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._openai-models.md differ diff --git a/docs/._other-models.md b/docs/._other-models.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._other-models.md differ diff --git a/docs/._plugins b/docs/._plugins new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._plugins differ diff --git a/docs/._python-api.md b/docs/._python-api.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._python-api.md differ diff --git a/docs/._related-tools.md b/docs/._related-tools.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._related-tools.md differ diff --git a/docs/._requirements.txt b/docs/._requirements.txt new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._requirements.txt differ diff --git a/docs/._schemas.md b/docs/._schemas.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._schemas.md differ diff --git a/docs/._setup.md b/docs/._setup.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._setup.md differ diff --git a/docs/._templates.md b/docs/._templates.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._templates.md differ diff --git a/docs/._tools.md b/docs/._tools.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._tools.md differ diff --git a/docs/._usage.md b/docs/._usage.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/._usage.md differ diff --git a/docs/_templates/._base.html b/docs/_templates/._base.html new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/_templates/._base.html differ diff --git a/docs/embeddings/._cli.md b/docs/embeddings/._cli.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/embeddings/._cli.md differ diff --git a/docs/embeddings/._index.md b/docs/embeddings/._index.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/embeddings/._index.md differ diff --git a/docs/embeddings/._python-api.md b/docs/embeddings/._python-api.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/embeddings/._python-api.md differ diff --git a/docs/embeddings/._storage.md b/docs/embeddings/._storage.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/embeddings/._storage.md differ diff --git a/docs/embeddings/._writing-plugins.md b/docs/embeddings/._writing-plugins.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/embeddings/._writing-plugins.md differ diff --git a/docs/plugins/._advanced-model-plugins.md b/docs/plugins/._advanced-model-plugins.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._advanced-model-plugins.md differ diff --git a/docs/plugins/._directory.md b/docs/plugins/._directory.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._directory.md differ diff --git a/docs/plugins/._index.md b/docs/plugins/._index.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._index.md differ diff --git a/docs/plugins/._installing-plugins.md b/docs/plugins/._installing-plugins.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._installing-plugins.md differ diff --git a/docs/plugins/._llm-markov b/docs/plugins/._llm-markov new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._llm-markov differ diff --git a/docs/plugins/._plugin-hooks.md b/docs/plugins/._plugin-hooks.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._plugin-hooks.md differ diff --git a/docs/plugins/._plugin-utilities.md b/docs/plugins/._plugin-utilities.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._plugin-utilities.md differ diff --git a/docs/plugins/._tutorial-model-plugin.md b/docs/plugins/._tutorial-model-plugin.md new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/._tutorial-model-plugin.md differ diff --git a/docs/plugins/llm-markov/._llm_markov.py b/docs/plugins/llm-markov/._llm_markov.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/llm-markov/._llm_markov.py differ diff --git a/docs/plugins/llm-markov/._pyproject.toml b/docs/plugins/llm-markov/._pyproject.toml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/docs/plugins/llm-markov/._pyproject.toml differ diff --git a/llm/.___init__.py b/llm/.___init__.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/.___init__.py differ diff --git a/llm/.___main__.py b/llm/.___main__.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/.___main__.py differ diff --git a/llm/._cli.py b/llm/._cli.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._cli.py differ diff --git a/llm/._default_plugins b/llm/._default_plugins new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._default_plugins differ diff --git a/llm/._embeddings.py b/llm/._embeddings.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._embeddings.py differ diff --git a/llm/._embeddings_migrations.py b/llm/._embeddings_migrations.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._embeddings_migrations.py differ diff --git a/llm/._errors.py b/llm/._errors.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._errors.py differ diff --git a/llm/._hookspecs.py b/llm/._hookspecs.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._hookspecs.py differ diff --git a/llm/._migrations.py b/llm/._migrations.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._migrations.py differ diff --git a/llm/._models.py b/llm/._models.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._models.py differ diff --git a/llm/._plugins.py b/llm/._plugins.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._plugins.py differ diff --git a/llm/._py.typed b/llm/._py.typed new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._py.typed differ diff --git a/llm/._templates.py b/llm/._templates.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._templates.py differ diff --git a/llm/._tools.py b/llm/._tools.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._tools.py differ diff --git a/llm/._utils.py b/llm/._utils.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/._utils.py differ diff --git a/llm/default_plugins/.___init__.py b/llm/default_plugins/.___init__.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/default_plugins/.___init__.py differ diff --git a/llm/default_plugins/._default_tools.py b/llm/default_plugins/._default_tools.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/default_plugins/._default_tools.py differ diff --git a/llm/default_plugins/._openai_models.py b/llm/default_plugins/._openai_models.py new file mode 100644 index 000000000..a94c0a1ad Binary files /dev/null and b/llm/default_plugins/._openai_models.py differ diff --git a/llm/default_plugins/openai_models.py b/llm/default_plugins/openai_models.py index ccca240cf..56c6fe09a 100644 --- a/llm/default_plugins/openai_models.py +++ b/llm/default_plugins/openai_models.py @@ -680,6 +680,12 @@ def set_usage(self, response, usage): input=input_tokens, output=output_tokens, details=simplify_usage_dict(usage) ) + def _headers_include_auth(self): + """Check if custom headers include an authorization header (case-insensitive).""" + if not self.headers: + return False + return any(key.lower() == "authorization" for key in self.headers) + def get_client(self, key, *, async_=False): kwargs = {} if self.api_base: @@ -692,9 +698,10 @@ def get_client(self, key, *, async_=False): kwargs["engine"] = self.api_engine if self.needs_key: kwargs["api_key"] = self.get_key(key) - else: + elif not self._headers_include_auth(): # OpenAI-compatible models don't need a key, but the - # openai client library requires one + # openai client library requires one - unless custom + # headers already provide authorization kwargs["api_key"] = "DUMMY_KEY" if self.headers: kwargs["default_headers"] = self.headers diff --git a/tests/._cassettes b/tests/._cassettes new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._cassettes differ diff --git a/tests/._conftest.py b/tests/._conftest.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._conftest.py differ diff --git a/tests/._test-llm-load-plugins.sh b/tests/._test-llm-load-plugins.sh new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test-llm-load-plugins.sh differ diff --git a/tests/._test_aliases.py b/tests/._test_aliases.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_aliases.py differ diff --git a/tests/._test_async.py b/tests/._test_async.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_async.py differ diff --git a/tests/._test_attachments.py b/tests/._test_attachments.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_attachments.py differ diff --git a/tests/._test_chat.py b/tests/._test_chat.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_chat.py differ diff --git a/tests/._test_chat_templates.py b/tests/._test_chat_templates.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_chat_templates.py differ diff --git a/tests/._test_cli_openai_models.py b/tests/._test_cli_openai_models.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_cli_openai_models.py differ diff --git a/tests/._test_cli_options.py b/tests/._test_cli_options.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_cli_options.py differ diff --git a/tests/._test_embed.py b/tests/._test_embed.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_embed.py differ diff --git a/tests/._test_embed_cli.py b/tests/._test_embed_cli.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_embed_cli.py differ diff --git a/tests/._test_encode_decode.py b/tests/._test_encode_decode.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_encode_decode.py differ diff --git a/tests/._test_fragments_cli.py b/tests/._test_fragments_cli.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_fragments_cli.py differ diff --git a/tests/._test_keys.py b/tests/._test_keys.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_keys.py differ diff --git a/tests/._test_llm.py b/tests/._test_llm.py new file mode 100644 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_llm.py differ diff --git a/tests/._test_llm_logs.py b/tests/._test_llm_logs.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_llm_logs.py differ diff --git a/tests/._test_migrate.py b/tests/._test_migrate.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_migrate.py differ diff --git a/tests/._test_plugins.py b/tests/._test_plugins.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_plugins.py differ diff --git a/tests/._test_templates.py b/tests/._test_templates.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_templates.py differ diff --git a/tests/._test_tools.py b/tests/._test_tools.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_tools.py differ diff --git a/tests/._test_tools_streaming.py b/tests/._test_tools_streaming.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_tools_streaming.py differ diff --git a/tests/._test_utils.py b/tests/._test_utils.py new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/._test_utils.py differ diff --git a/tests/cassettes/._test_tools b/tests/cassettes/._test_tools new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/cassettes/._test_tools differ diff --git a/tests/cassettes/._test_tools_streaming b/tests/cassettes/._test_tools_streaming new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/cassettes/._test_tools_streaming differ diff --git a/tests/cassettes/test_tools/._test_tool_use_basic.yaml b/tests/cassettes/test_tools/._test_tool_use_basic.yaml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/cassettes/test_tools/._test_tool_use_basic.yaml differ diff --git a/tests/cassettes/test_tools/._test_tool_use_chain_of_two_calls.yaml b/tests/cassettes/test_tools/._test_tool_use_chain_of_two_calls.yaml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/cassettes/test_tools/._test_tool_use_chain_of_two_calls.yaml differ diff --git a/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_a.yaml b/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_a.yaml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_a.yaml differ diff --git a/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_b.yaml b/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_b.yaml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_b.yaml differ diff --git a/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_c.yaml b/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_c.yaml new file mode 100755 index 000000000..a94c0a1ad Binary files /dev/null and b/tests/cassettes/test_tools_streaming/._test_tools_streaming_variant_c.yaml differ diff --git a/tests/test_llm.py b/tests/test_llm.py index 334d40f6f..ce7c98f38 100644 --- a/tests/test_llm.py +++ b/tests/test_llm.py @@ -431,6 +431,44 @@ def test_openai_localai_configuration(mocked_localai, user_path): } +EXTRA_MODELS_YAML_WITH_AUTH = """ +- model_id: custom-auth-model + model_name: my-model + api_base: "http://custom-auth.localhost" + headers: + authorization: "Basic dXNlcjpwYXNzd29yZA==" +""" + + +def test_openai_custom_auth_headers(httpx_mock, user_path): + """Test that custom authorization headers are used instead of DUMMY_KEY.""" + httpx_mock.add_response( + method="POST", + url="http://custom-auth.localhost/chat/completions", + json={ + "model": "my-model", + "usage": {"prompt_tokens": 1, "completion_tokens": 2, "total_tokens": 3}, + "choices": [{"message": {"content": "Authenticated response"}}], + }, + headers={"Content-Type": "application/json"}, + ) + # Write the configuration file with custom auth header + config_path = user_path / "extra-openai-models.yaml" + config_path.write_text(EXTRA_MODELS_YAML_WITH_AUTH, "utf-8") + # Run the prompt + runner = CliRunner() + result = runner.invoke( + cli, ["--no-stream", "--model", "custom-auth-model", "test prompt"] + ) + assert result.exit_code == 0 + assert result.output == "Authenticated response\n" + # Check that the custom authorization header was sent, not DUMMY_KEY + last_request = httpx_mock.get_requests()[-1] + auth_header = last_request.headers.get("authorization") + assert auth_header == "Basic dXNlcjpwYXNzd29yZA==" + assert "Bearer DUMMY_KEY" not in str(last_request.headers) + + @pytest.mark.parametrize( "args,exit_code", (