Skip to main content

Local Copilot as a Service wrapper with CLI and REST APIs.

Project description

copilot-service

copilot-as-a-service

copilot-service provides a stable local CLI and REST wrapper around Copilot/LLM CLI tooling so scripts and agents can call a normalized task API.

What problem this solves

Different LLM CLIs have different prompt formats and output styles. This project gives one stable contract for task-based calls (route-topic, freeform) and isolates provider setup in local config.

Releases

Automated releases are available through GitHub Actions. See docs/release.md for full instructions.

Python client

from copilot_service.client import CopilotServiceClient

client = CopilotServiceClient()  # connects to http://127.0.0.1:8765

result = client.freeform("Explain this error")
if result.ok:
    print(result.content["text"])

result = client.route_topic(
    title="Article title",
    message="Full message",
    article_excerpt="...",
    topics={"asr": "Speech Recognition", "nlp": "NLP"},
)
print(result.content["decision"])

See docs/api-contract.md for the full API contract.

CLI UX

Running copilot-caas with no arguments shows a colorful welcome screen and exits 0:

copilot-caas

Check the installed version:

copilot-caas --version

Run a task:

copilot-caas ask --input examples/route-topic-request.json

Colors are automatically disabled when NO_COLOR is set or output is not a TTY.

Quickstart (fake provider)

python -m venv .venv
. .venv/bin/activate
pip install -e .

export COPILOT_SERVICE_PROVIDER=fake
export COPILOT_SERVICE_FAKE_RESPONSE='{"decision":"asr","confidence":0.8,"reason":"fake"}'
copilot-service ask --input examples/route-topic-request.json

Quickstart (shell provider)

export COPILOT_SERVICE_PROVIDER=shell
export COPILOT_SERVICE_SHELL_COMMAND='python -c "import sys; print(sys.stdin.read())"'
copilot-service ask --task freeform --prompt "Explain this"

REST usage

copilot-service serve --host 127.0.0.1 --port 8765

curl -sS http://127.0.0.1:8765/health
curl -sS http://127.0.0.1:8765/v1/ask \
  -H 'content-type: application/json' \
  --data @examples/freeform-request.json
curl -sS http://127.0.0.1:8765/v1/tasks/route-topic \
  -H 'content-type: application/json' \
  --data @examples/route-topic-request.json

Article-ingestion integration example

See examples/article-ingestion-usage.sh for a simple pipeline wrapper around the route-topic task.

Environment

  • COPILOT_SERVICE_PROVIDER (shell for MVP, fake for tests)
  • COPILOT_SERVICE_SHELL_COMMAND (provider command)
  • COPILOT_SERVICE_MODEL (default gpt-5-mini)
  • COPILOT_SERVICE_TIMEOUT_SECONDS (default 90)
  • COPILOT_SERVICE_HOST (default 127.0.0.1)
  • COPILOT_SERVICE_PORT (default 8765)

Limitations

  • MVP ships only with shell/fake providers.
  • Output quality depends on your configured local command and prompt discipline.
  • route-topic fallback behavior can mask model errors when enabled (default true).

Security note

REST binds to 127.0.0.1 by default. The shell command is loaded only from local environment/config (never from request payload).

Debug systemd service

If the service is installed via scripts/install-systemd-user.sh and requests fail, use these commands to diagnose.

Check the env file written by the installer:

cat ~/.config/copilot-service/env

Check service status:

systemctl --user status copilot-service.service --no-pager

Tail recent logs:

journalctl --user -u copilot-service.service -n 120 --no-pager

Show unit configuration (env file path and ExecStart):

systemctl --user show copilot-service.service -p EnvironmentFiles -p ExecStart

Health check:

curl -s http://127.0.0.1:8765/health | jq .

Route-topic API call:

curl -s http://127.0.0.1:8765/v1/tasks/route-topic \
  -H 'Content-Type: application/json' \
  --data-binary @/tmp/route-topic-request.json | jq .

Direct provider check (replace /path/to/copilot with the value of COPILOT_SERVICE_SHELL_COMMAND in the env file):

/path/to/copilot \
  -p 'Return only this exact JSON and nothing else: {"ok":true}' \
  --model gpt-5-mini \
  --silent \
  --no-color \
  --no-auto-update \
  --stream off \
  --no-custom-instructions \
  --no-ask-user \
  --available-tools=

Expected output (the leading bullet is stripped automatically by the JSON extractor):

● {"ok":true}

Shell provider modes (COPILOT_SERVICE_SHELL_MODE):

Value Behavior
argv Prompt passed via -p flag; uses shell=False. Required for GitHub Copilot CLI.
stdin Prompt piped to subprocess stdin; uses shell=True. Original default.
`` (empty) Same as stdin — backward-compatible default.

The installer sets COPILOT_SERVICE_SHELL_MODE=argv automatically.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

copilot_caas-1.0.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

copilot_caas-1.0.0-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file copilot_caas-1.0.0.tar.gz.

File metadata

  • Download URL: copilot_caas-1.0.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for copilot_caas-1.0.0.tar.gz
Algorithm Hash digest
SHA256 164f512145a91f7bd6c47d80e2266454db62fdfe1a4f601e5cea2cb53ff1d87e
MD5 2f18b02f137cd5de89cfd4ca46f0212f
BLAKE2b-256 5d2e9ddb9eb4c3bbbeb4776262cc146000617904366e24cecd94e6c5f3102986

See more details on using hashes here.

Provenance

The following attestation bundles were made for copilot_caas-1.0.0.tar.gz:

Publisher: publish.yml on tiroq/copilot-service

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file copilot_caas-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: copilot_caas-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for copilot_caas-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4036a2b6e12eb93c084d95f4a1cb629d79d112c81dde6fb272ecca915964f482
MD5 e287dfaa3e5ca6f53009ec0f4b96bc23
BLAKE2b-256 1229825851f34c8b78204b243f41a2edeb9937675dec17bc20881341457d137b

See more details on using hashes here.

Provenance

The following attestation bundles were made for copilot_caas-1.0.0-py3-none-any.whl:

Publisher: publish.yml on tiroq/copilot-service

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page